1つのクエリで複数の集計を組み合わせる
直前の3つの演習では、ROLLUP、CUBE、GROUPING SETS のグルーピング演算子を見てきました。 この3つの中で、最も柔軟なのは GROUPING SETS で、必要な集計レベルを正確に指定できます。 GROUPING SETS は(ROLLUP と違って)階層を前提とせず、(CUBE と違って)列数が多くなっても扱いやすさを保てます。
この演習では、データを使って次の仮説を検証します。
- 2019年11月に研修を導入して以降、1か月あたりのインシデント数が減っている。
- 平日では火曜日に他の曜日よりインシデントが多い。
- 週末は平日よりインシデントが多い。
この演習はコースの一部です
SQL Serverで学ぶ時系列分析
演習の手順
上の仮説に基づいてグルーピングセットを設定してください。 総計(グランドトータル)に加えて、次のグルーピングセットを表示します。
- 暦年と月の組み合わせによるセット
- 曜日によるセット
- 週末かどうかによるセット
実践的なインタラクティブ演習
このサンプルコードを完成させて、この演習に挑戦してみましょう。
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;