Mehrere Aggregationen in einer Abfrage kombinieren
In den letzten drei Übungen haben wir die Gruppierungsoperatoren ROLLUP, CUBE und GROUPING SETS durchgespielt. Von diesen dreien ist GROUPING SETS am anpassbarsten und erlaubt dir, genau die Aggregationsebenen zu erstellen, die du brauchst. GROUPING SETS trifft keine Annahmen über Hierarchien (im Gegensatz zu ROLLUP) und bleibt auch mit mehreren Spalten gut handhabbar (im Gegensatz zu CUBE).
In dieser Übung wollen wir mehrere Vermutungen anhand unserer Daten prüfen:
- Seit der Einführung der Schulung im November 2019 gab es weniger Vorfälle pro Monat.
- Am Dienstag treten mehr Vorfälle auf als an anderen Wochentagen.
- An Wochenenden treten mehr Vorfälle auf als an Werktagen.
Diese Übung ist Teil des Kurses
Zeitreihenanalyse in SQL Server
Anleitung zur Übung
Ergänze die Grouping Sets basierend auf den obigen Vermutungen. Zusätzlich zur Gesamtsumme wollen wir folgende Grouping Sets sehen:
- Ein Set nach Kalenderjahr und -monat
- Ein Set nach Wochentag
- Ein Set nach der Frage, ob das Datum am Wochenende liegt oder nicht
Interaktive Übung
Vervollständige den Beispielcode, um diese Übung erfolgreich abzuschließen.
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;