首页 > 解决方案 > 按 SQL 分组时处理未观察到的类别

问题描述

我有一个关于在分组时处理未观察到的类别的问题。例如,

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。

我怎么能这样做?

谢谢你。

标签: sqlgroup-bymissing-data

解决方案


您需要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


推荐阅读