Полный запрос с пропущенными месяцами и регионами - PullRequest
0 голосов
/ 21 июня 2020

У меня следующий запрос:

SELECT
    DATEPART(mm, inv.invoicedate) as [month],
    SUM(amount) AS amount,  
    inv.[state]
FROM 
    invoice inv
WHERE 
    inv.[state] IN ('TX','AZ','NV')
GROUP BY 
    DATEPART(mm, inv.invoicedate), inv.[state]
ORDER BY 
    DATEPART(mm, inv.invoicedate)

Результат этого запроса следующий:

введите описание изображения здесь

У нас есть только 3 состояния в БД: TX, AZ и NV.

Мне нужно, неважно, возвращают ли данные только 4 месяца, которые мне нужно завершить весь год месяцев и регионов. Для недостающих месяцев сумма, конечно же, будет 0.

Например, в приведенных выше результатах в апреле есть данные только для TX и NV, мне понадобятся данные для AZ с суммой 0, поэтому каждый месяц будет 3 ряды. Итак, общее количество строк, которые мне нужно получить, составляет 36, то есть 3 региона умноженные на 12 месяцев.

Есть подсказка?

1 Ответ

2 голосов
/ 21 июня 2020

Вы можете использовать предложения VALUES для создания производных таблиц всех интересующих month и state значений, затем LEFT JOIN в таблицу счетов-фактур и GROUP BY месяц и состояние. , используя COALESCE, чтобы превратить NULL значения в 0:

SELECT months.month, 
       states.state, 
       COALESCE(SUM(inv.amount), 0) AS amount
FROM (VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12)) AS months(month)
CROSS JOIN (VALUES ('AZ'), ('NV'), ('TX')) AS states(state)
LEFT JOIN invoice inv ON DATEPART(mm, inv.invoicedate) = months.month
                     AND inv.state = states.state
GROUP BY months.month, states.state
ORDER BY months.month, states.state

Демо на dbfiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...