Combina più aggregazioni in un'unica query
Negli ultimi tre esercizi, abbiamo visto in azione gli operatori di raggruppamento ROLLUP, CUBE e GROUPING SETS. Tra questi tre, GROUPING SETS è il più personalizzabile: ti permette di costruire esattamente i livelli di aggregazione che vuoi. GROUPING SETS non fa assunzioni su gerarchie (a differenza di ROLLUP) e resta gestibile anche con un buon numero di colonne (a differenza di CUBE).
In questo esercizio vogliamo verificare alcune ipotesi sui nostri dati:
- Da quando abbiamo introdotto la formazione a novembre 2019, abbiamo visto meno incidenti al mese.
- Si verificano più incidenti il martedì rispetto agli altri giorni feriali.
- Si verificano più incidenti nei weekend rispetto ai giorni feriali.
Questo esercizio fa parte del corso
Analisi delle serie temporali in SQL Server
Istruzioni dell'esercizio
Compila i grouping set in base alle ipotesi qui sopra. Oltre al totale complessivo, vogliamo vedere i seguenti grouping set:
- Un set per anno e mese di calendario
- Un set per giorno della settimana
- Un set in base al fatto che la data cada nel weekend o meno
esercizio interattivo pratico
Prova questo esercizio completando questo codice di esempio.
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;