Inizia subitoInizia gratis

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:

  1. Da quando abbiamo introdotto la formazione a novembre 2019, abbiamo visto meno incidenti al mese.
  2. Si verificano più incidenti il martedì rispetto agli altri giorni feriali.
  3. Si verificano più incidenti nei weekend rispetto ai giorni feriali.

Questo esercizio fa parte del corso

Analisi delle serie temporali in SQL Server

Visualizza corso

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;
Modifica ed esegui il codice