Aan de slagGa gratis aan de slag

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

Cursus bekijken

Oefeninstructies

  • Vul een CASE-expressie in waarmee we de functie SUM() 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.IncidentDate of it.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;
Code bewerken en uitvoeren