CommencezCommencez gratuitement

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 :

  1. Nous observons moins d'incidents par mois depuis l'introduction de la formation en novembre 2019.
  2. Il y a plus d'incidents le mardi que les autres jours de semaine.
  3. 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

Voir le cours

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;
Modifier et exécuter le code