Aan de slagBegin gratis

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

Bekijk cursus

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!

Interactieve oefening met praktijkervaring

Probeer deze oefening door deze voorbeeldcode aan 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