sql - 按 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。
我怎么能这样做?
谢谢你。
解决方案
您需要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
推荐阅读
- mysql - MySQL AUTO_INCREMENT 设置一直未设置
- c++ - Linux 上的 Win32 BlockInput 替代方案?
- python - NumPy 数组逐行和逐列切片语法
- python - 无头 Chrome 驱动程序不适用于 Selenium
- swiftui - SwiftUI,列表行添加按钮
- vb.net - 如何在 vb.net 中创建随机 Unicode 或 UTF-8 文件?
- amazon-web-services - 如何使用新的 AWS GO SDK-V2 代入角色以进行跨账户访问
- minecraft - 如何访问我的 Minecraft 服务器控制台?
- php - PHP RSS 提要帮助获取 XML 标记以显示
- c - 我不明白这一点,而 C 中的条件