在一条查询中组合多种聚合
在前面三个练习中,您已经学习了分组运算符 ROLLUP、CUBE 和 GROUPING SETS。这三者中,GROUPING SETS 的可定制度最高,能够精确构建您需要的聚合层级。与 ROLLUP 不同,GROUPING SETS 不对层级结构做任何假设;与 CUBE 不同,即使列较多时也更易于管理。
在本练习中,我们希望用数据检验以下猜想:
- 自 2019 年 11 月引入培训以来,每月事件数更少了。
- 周二发生的事件比其他工作日更多。
- 周末发生的事件比工作日更多。
本练习是课程的一部分
SQL Server 中的时间序列分析
练习说明
请根据上面的猜想补全 grouping sets。除了总计(grand total)以外,我们希望看到以下 grouping set:
- 按日历年和月份分组的一组
- 按星期几分组的一组
- 按是否为周末分组的一组
交互式实操练习
通过完成这段示例代码来试试这个练习。
SELECT
c.CalendarYear,
c.CalendarMonth,
c.DayOfWeek,
c.IsWeekend,
SUM(ir.NumberOfIncidents) AS NumberOfIncidents
FROM dbo.IncidentRollup ir
INNER JOIN dbo.Calendar c
ON ir.IncidentDate = c.Date
GROUP BY GROUPING SETS
(
-- Each non-aggregated column from above should appear once
-- Calendar year and month
(___, ___),
-- Day of week
(___),
-- Is weekend or not
(___),
-- This remains empty; it gives us the grand total
()
)
ORDER BY
c.CalendarYear,
c.CalendarMonth,
c.DayOfWeek,
c.IsWeekend;