Calcul d’agrégats filtrés
Si vous souhaitez compter le nombre d’occurrences d’un événement selon certains critères de filtrage, vous pouvez exploiter des fonctions d’agrégation comme SUM(), MIN() et MAX(), ainsi que des expressions CASE. Par exemple, SUM(CASE WHEN ir.IncidentTypeID = 1 THEN 1 ELSE 0 END) renverra le nombre d’incidents associés au type d’incident 1. Si vous incluez une instruction SUM() pour chaque type d’incident, vous avez effectué un pivot du jeu de données par identifiant de type d’incident.
Dans ce scénario, la direction souhaite que vous indiquiez, par type d’incident, combien de jours à « grands incidents » nous avons eus par rapport aux jours à « petits incidents ». La direction définit un jour à grands incidents comme ayant plus de 5 occurrences du même type d’incident le même jour, et un jour à petits incidents comme ayant entre 1 et 5.
Cet exercice fait partie du cours
<cours>Analyse de séries temporelles dans SQL Server</cours>Instructions de l’exercice
- Complétez une expression
CASEqui nous permet d’utiliser la fonctionSUM()pour calculer le nombre de jours à grands incidents et à petits incidents. - Dans l’expression
CASE, vous devez renvoyer 1 si le critère de filtrage approprié est satisfait et 0 sinon. - Veillez à préciser l’alias lors de la référence à une colonne, comme
ir.IncidentDateouit.IncidentType!
Exercice interactif pratique
Essayez cet exercice en complétant ce code d’exemple.
SELECT
it.IncidentType,
-- Fill in the appropriate expression
SUM(___ WHEN ir.NumberOfIncidents > 5 THEN ___ ELSE ___ ___) AS NumberOfBigIncidentDays,
-- Number of incidents will always be at least 1, so
-- no need to check the minimum value, just that it's
-- less than or equal to 5
SUM(___ WHEN ir.NumberOfIncidents <= 5 THEN ___ ELSE ___ ___) AS NumberOfSmallIncidentDays
FROM dbo.IncidentRollup ir
INNER JOIN dbo.IncidentType it
ON ir.IncidentTypeID = it.IncidentTypeID
WHERE
ir.IncidentDate BETWEEN '2019-08-01' AND '2019-10-31'
GROUP BY
it.IncidentType;