Łączenie wielu agregacji w jednym zapytaniu
W ostatnich trzech ćwiczeniach omówiliśmy operatory grupowania ROLLUP, CUBE i GROUPING SETS. Spośród tych trzech najbardziej elastyczny jest GROUPING SETS – pozwala dokładnie określić, jakie poziomy agregacji chcesz uzyskać. GROUPING SETS nie zakłada żadnej hierarchii (w przeciwieństwie do ROLLUP) i pozostaje czytelny nawet przy większej liczbie kolumn (w przeciwieństwie do CUBE).
W tym ćwiczeniu chcemy zweryfikować kilka hipotez dotyczących naszych danych:
- Od momentu wprowadzenia szkoleń w listopadzie 2019 roku miesięczna liczba incydentów spadła.
- W środy odnotowuje się więcej incydentów niż w inne dni tygodnia.
- W weekendy dochodzi do większej liczby incydentów niż w dni robocze.
To ćwiczenie jest częścią kursu
Analiza szeregów czasowych w SQL Server
Instrukcje do ćwiczenia
Uzupełnij zestawy grupowania zgodnie z powyższymi hipotezami. Oprócz sumy ogólnej chcemy uwzględnić następujące zestawy grupowania:
- jeden zestaw według roku i miesiąca kalendarzowego,
- jeden zestaw według dnia tygodnia,
- jeden zestaw według tego, czy dany dzień jest weekendem, czy nie.
Interaktywne ćwiczenie praktyczne
Spróbuj tego ćwiczenia, uzupełniając ten przykładowy kod.
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;