Gefilterde aggregaties berekenen
Als we het aantal voorkomens van een gebeurtenis willen tellen op basis van bepaalde filtercriteria, kunnen we gebruikmaken van aggregatiefuncties zoals SUM(), MIN() en MAX(), en van CASE-expressies. Bijvoorbeeld, SUM(CASE WHEN ir.IncidentTypeID = 1 THEN 1 ELSE 0 END) geeft het aantal incidenten terug dat is gekoppeld aan incidenttype 1. Als je één SUM()-instructie opneemt voor elk incidenttype, heb je de gegevensset gepivot op incidenttype-ID.
In dit scenario wil het management weten, per incidenttype, hoeveel "grote-incident"-dagen we hebben gehad versus "kleine-incident"-dagen. Management definieert een grote-incident-dag als meer dan 5 voorkomens van hetzelfde incidenttype op dezelfde dag, en een kleine-incident-dag als tussen 1 en 5.
Deze oefening maakt deel uit van de cursus
Tijdreeksanalyse in SQL Server
Oefeninstructies
- Vul een
CASE-expressie in waarmee we de functieSUM()kunnen gebruiken om het aantal grote-incident- en kleine-incident-dagen te berekenen. - In de
CASE-expressie retourneer je 1 als aan het juiste filtercriterium is voldaan en anders 0. - Zorg dat je de alias specificeert wanneer je naar een kolom verwijst, zoals
ir.IncidentDateofit.IncidentType!
Praktische interactieve oefening
Probeer deze oefening eens door deze voorbeeldcode in te vullen.
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;