Combină mai multe agregări într-o singură interogare
În ultimele trei exerciții, am explorat operatorii de grupare ROLLUP, CUBE și GROUPING SETS. Dintre aceștia, GROUPING SETS este cel mai flexibil, permițându-ți să definești exact nivelurile de agregare dorite. GROUPING SETS nu presupune nicio ierarhie (spre deosebire de ROLLUP) și rămâne ușor de gestionat chiar și cu un număr mare de coloane (spre deosebire de CUBE).
În acest exercițiu, vrem să testăm câteva ipoteze cu datele noastre:
- Am înregistrat mai puține incidente pe lună de când am introdus sesiunile de formare în noiembrie 2019.
- Mai multe incidente au loc marțea decât în celelalte zile lucrătoare.
- Mai multe incidente au loc în weekend decât în zilele lucrătoare.
Acest exercițiu face parte din cursul
Analiza seriilor de timp în SQL Server
Instrucțiuni pentru exercițiu
Completează seturile de grupare pe baza ipotezelor de mai sus. Pe lângă totalul general, dorim să obținem următoarele seturi de grupare:
- Un set după anul și luna calendaristică
- Un set după ziua săptămânii
- Un set după cum data este sau nu weekend
Exercițiu interactiv practic
Încearcă acest exercițiu completând acest cod de exemplu.
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;