在單一查詢中結合多個彙總
在前面三個練習中,我們依序介紹了 ROLLUP、CUBE 與 GROUPING SETS 這三種分組運算子。三者之中,GROUPING SETS 的客製化程度最高,能讓你精準建立所需的彙總層級。GROUPING SETS 不會對階層關係做任何假設(不像 ROLLUP),而且在欄位數量較多時仍可維持可控的複雜度(不像 CUBE)。
在這個練習裡,我們想用資料來檢驗幾項推測:
- 自從 2019 年 11 月導入訓練後,每月事件數變少。
- 事件在星期二發生的次數比其他平日多。
- 事件在週末發生的次數比平日多。
本練習屬於課程
SQL Server 的時間序列分析
練習說明
請依上述推測填寫 grouping sets。我們想在總計之外,看到以下這些 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;