У меня есть таблица с ежемесячной статистикой по клиентам. Столбцы: Номер клиента, Год, Месяц, Поездки.
У некоторых клиентов нет командировок в некоторые месяцы, поэтому существуют комбинации CustNo, Year и Month, в которых нет строк в этой таблице.
Я пытаюсь написать запрос, который показывает 0 для тех комбинаций CustNo, Year и Month, которые не имеют поездок, вместо создания пустой строки.
Для начала я создал таблицу ValidPeriods, в которой есть столбцы "Год" и "Месяц", содержащие допустимые периоды. Затем я могу сделать такой запрос:
SELECT v.ValidYear, v.ValidMonth, tc.CustNo, tc.Trips
FROM ValidPeriods v
LEFT OUTER JOIN TempTrips AS tc ON v.ValidYear = tc.Year
AND v.ValidMonth = tc.Month
WHERE tc.CustNo IN (1001230, 1001286, 1001292)
Это даст мне строки для всех периодов, с 1 строкой со значениями NULL для тех периодов, когда в списке нет клиентов, у которых есть какие-либо поездки.
Но как мне получить по одной строке для каждого клиента в списке за все периоды?
В идеале я хочу это:
2016 1 1001230 0
2016 1 1001286 14
2016 1 1001292 23
2016 2 1001230 7
2016 2 1001286 0
2016 2 1001292 4
так далее...
TempTrips - это таблица, о которой я упоминаю в начале сообщения. Столбцы: Номер клиента, Год, Месяц, Поездки.


Сгенерируйте строки с помощью cross join. Затем введите значения с помощью left join:
SELECT ym.ValidYear, ym.ValidMonth, c.CustNo, COALESCE(tt.Trips, 0)
FROM ValidPeriods ym CROSS JOIN
(VALUES (1001230), (1001286), (1001292)) c(CustNo) LEFT JOIN
TempTrips tt
ON tt.ValidYear = ym.ValidYear AND tt.ValidMOnth = ym.ValidMonth AND
tt.CustNo = c.CustNo;
Как выглядит
temptrips?