CommencerCommencez gratuitement

Combiner plusieurs agrégations en une seule requête

Dans les trois derniers exercices, nous avons parcouru les opérateurs de regroupement ROLLUP, CUBE et GROUPING SETS. Parmi ces trois, GROUPING SETS est le plus personnalisable : il vous permet de définir exactement les niveaux d’agrégation souhaités. GROUPING SETS ne fait aucune hypothèse de hiérarchie (contrairement à ROLLUP) et reste gérable avec un bon nombre de colonnes (contrairement à CUBE).

Dans cet exercice, nous voulons tester plusieurs hypothèses à partir de nos données :

  1. Nous avons constaté moins d’incidents par mois depuis l’introduction de la formation en novembre 2019.
  2. Davantage d’incidents surviennent le mardi que les autres jours de semaine.
  3. Il y a plus d’incidents le week-end qu’en semaine.

Cet exercice fait partie du cours

<cours>Analyse de séries temporelles dans SQL Server</cours>
Voir le cours

Instructions de l’exercice

Renseignez les grouping sets en fonction de nos hypothèses ci-dessus. Nous voulons voir les grouping sets suivants en plus du total général :

  • Un ensemble par année et mois calendaires
  • Un ensemble par jour de la semaine
  • Un ensemble selon que la date tombe un week-end 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