Aan de slagGa gratis aan de slag

Combineer meerdere aggregaties in één query

In de laatste drie oefeningen hebben we de groeperingsoperatoren ROLLUP, CUBE en GROUPING SETS doorgenomen. Van deze drie is GROUPING SETS het meest aanpasbaar: daarmee stel je precies de aggregatieniveaus samen die je wilt. GROUPING SETS gaat niet uit van een hiërarchie (in tegenstelling tot ROLLUP) en blijft beheersbaar met een redelijk aantal kolommen (in tegenstelling tot CUBE).

In deze oefening willen we een aantal veronderstellingen testen met onze data:

  1. We zien sinds de introductie van trainingen in november 2019 minder incidenten per maand.
  2. Er komen meer incidenten voor op dinsdag dan op andere doordeweekse dagen.
  3. Er komen meer incidenten voor in het weekend dan op doordeweekse dagen.

Deze oefening maakt deel uit van de cursus

Tijdreeksanalyse in SQL Server

Cursus bekijken

Oefeninstructies

Vul de grouping sets in op basis van de bovenstaande veronderstellingen. We willen de volgende grouping sets zien naast ons totaaltelling:

  • Eén set per kalenderjaar en -maand
  • Eén set per dag van de week
  • Eén set op basis van of de datum in het weekend valt of niet

Praktische interactieve oefening

Probeer deze oefening eens door deze voorbeeldcode in te vullen.

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;
Code bewerken en uitvoeren