Форсирование пустых строк из запроса

У меня есть таблица с ежемесячной статистикой по клиентам. Столбцы: Номер клиента, Год, Месяц, Поездки.

У некоторых клиентов нет командировок в некоторые месяцы, поэтому существуют комбинации 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?

Gordon Linoff 16.04.2018 14:28

TempTrips - это таблица, о которой я упоминаю в начале сообщения. Столбцы: Номер клиента, Год, Месяц, Поездки.

PeterG 16.04.2018 14:41
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
2
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Сгенерируйте строки с помощью 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;

Другие вопросы по теме