#sql #sql-server
Вопрос:
У меня есть таблица с общим объемом продаж по каждому городу за каждый год, но в моей таблице нет продаж по городам за несколько лет, и мы также не видим эту информацию.
Теперь я хочу подготовить результирующий набор с указанием продаж всех городов за год и отобразить города, в которых нет продаж за год со значением 0
Городской стол
CityKey | Город |
---|---|
1 | Нью-Йорк |
2 | Даллас |
3 | Сан-Франциско |
Таблица транзакций
Город | Общий объем продаж | Год |
---|---|---|
Нью-Йорк | 100 | 2019 |
Даллас | 50 | 2019 |
Сан-Франциско | 100 | 2019 |
Нью-Йорк | 222 | 2020 |
Результат — транзакции по городу:
Город | Общий объем продаж | Год |
---|---|---|
Нью-Йорк | 100 | 2019 |
Даллас | 50 | 2019 |
Сан-Франциско | 100 | 2019 |
Нью-Йорк | 222 | 2020 |
Даллас | 0 | 2020 |
Сан-Франциско | 0 | 2020 |
Ответ №1:
Используйте a cross join
для создания всех строк, а затем left join
для ввода существующих данных:
select c.city, y.year, coalesce(t.total_sales, 0)
from cities c cross join
(select distinct year from transactions) y left join
transactions t
on t.city = c.city and t.year = y.year;
Комментарии:
1. этот код не помогает и вызывает множество проблем с производительностью. У меня есть таблица городов,таблица года и таблицы транзакций отдельно
2. @user15488631 . . . Тогда просто используйте таблицу лет вместо
y
. Вы не упоминаете об этом в своем вопросе.