Combiner plusieurs agrégations dans une seule requête
Dans les trois derniers exercices, nous avons passé en revue les opérateurs de regroupement ROLLUP, CUBE et GROUPING SETS. Parmi les trois, GROUPING SETS est le plus personnalisable : il vous permet de définir précisément les niveaux d'agrégation souhaités. GROUPING SETS ne fait aucune supposition sur une hiérarchie (contrairement à ROLLUP) et reste gérable même avec un bon nombre de colonnes (contrairement à CUBE).
Dans cet exercice, nous voulons mettre à l'épreuve plusieurs hypothèses à partir de nos données :
- Nous observons moins d'incidents par mois depuis l'introduction de la formation en novembre 2019.
- Il y a plus d'incidents le mardi que les autres jours de semaine.
- Il y a plus d'incidents la fin de semaine que les jours de semaine.
Cette activité fait partie du cours
Analyse de séries chronologiques dans SQL Server
Instructions de l’exercice
Complétez les ensembles de regroupement en fonction des hypothèses ci-dessus. En plus du total général, nous voulons voir les ensembles suivants :
- Un ensemble par année civile et par mois
- Un ensemble par jour de la semaine
- Un ensemble selon que la date tombe une fin de semaine ou non
Exercice interactif pratique
Essayez cet exercice en complétant ce code d’exemple.
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;