Обрабатывать ненаблюдаемые категории при группировании по SQL - PullRequest
0 голосов
/ 09 июня 2018

У меня есть вопрос об обработке ненаблюдаемых категорий при группировании по ним.Например,

Month   Number
Jan.    1
Jan.    4
Mar.    5
Apr.    3
July.   1
Sept.   4
Nov.    7
Nov.    8
Dec.    9
Dec.    1
Dec.    2

Если я использую этот запрос

select t.Month, sum(t.Number) as sum from table t group by t.Month;

Он просто вернет таблицу, подобную этой

Month   sum
Jan.    5
Mar.    5
Apr.    3
July.   1
Sept.   4
Nov.    15
Dec.    12

Но я хочу получитьна самом деле это

Month   sum
Jan.    5
Feb.    0
Mar.    5
Apr.    3
May.    0
June.   0
July.   1
Aug.    0
Sept.   4
Oct.    0
Nov.    15
Dec.    12

Он также будет включать эти ненаблюдаемые месяцы и возвращать значения как 0.

Как я могу это сделать?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 10 июня 2018

Вам необходимо LEFT JOIN календарь, сгруппированный по месяцу календаря.

select cd.months, coalesce(sum(t.Number),0) as 'sum' 
from (
SELECT 'Jan.' as 'months' UNION ALL
SELECT 'Feb.' UNION ALL
SELECT 'Mar.' UNION ALL
SELECT 'Apr.' UNION ALL
SELECT 'May.' UNION ALL
SELECT 'June.' UNION ALL
SELECT 'July.' UNION ALL
SELECT 'Aug.' UNION ALL
SELECT 'Sept.' UNION ALL
SELECT 'Oct.' UNION ALL
SELECT 'Nov.' UNION ALL
SELECT 'Dec.' 
) cd LEFT JOIN T on cd.months = t.Month
group by cd.months;

sqlfiddle: https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=1aca12dbcc087ce85145e3a8919a6182

0 голосов
/ 09 июня 2018

Используйте left outer join, где левая сторона - это таблица всех месяцев, а правая - таблица значений, связанных с каждым месяцем.Вот пример:

Создайте таблицу месяцев (1 представляет январь - если это проще, вы также можете придерживаться названий месяцев):

create table month (month int);
insert into month values
    (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12);

Таблица суммируемых значений, связанных с каждым месяцем:

create table month_val (month int, val int);
insert into month_val values
    (1, 10), (1, 11), (2, 20), (2, 21), (3, 30);

Присоединиться к таблицам слева:

select month.month, coalesce(sum(month_val.val), 0)
from month
left join month_val on (month.month = month_val.month)
group by month.month

Результат:

month   coalesce(sum(month_val.val), 0)
1   21
2   41
3   30
4   0
5   0
6   0
7   0
8   0
9   0
10  0
11  0
12  0

Конечно, вы можете использовать названия месяцев вместо номеров месяцев или конвертировать месяцномер в имя с помощью функции, специфичной для вашей базы данных.

...