Beräkna filtrerade aggregat
Om vi vill räkna antalet förekomster av en händelse utifrån vissa filtervillkor kan vi använda aggregatfunktioner som SUM(), MIN() och MAX(), tillsammans med CASE-uttryck. Till exempel returnerar SUM(CASE WHEN ir.IncidentTypeID = 1 THEN 1 ELSE 0 END) antalet incidenter kopplade till incidenttyp 1. Om du inkluderar ett SUM()-uttryck för varje incidenttyp har du pivoterat datamängden efter incidenttyp-ID.
I det här scenariot vill ledningen veta hur många "stora-incident"-dagar respektive "små-incident"-dagar vi har haft, uppdelat per incidenttyp. Ledningen definierar en stor-incident-dag som en dag med fler än 5 förekomster av samma incidenttyp, och en liten-incident-dag som en dag med mellan 1 och 5 förekomster.
Den här övningen är en del av kursen
Tidsserieanalys i SQL Server
Övningsinstruktioner
- Fyll i ett
CASE-uttryck som gör det möjligt att använda funktionenSUM()för att beräkna antalet stora-incident-dagar och liten-incident-dagar. - I
CASE-uttrycket ska du returnera 1 om rätt filtervillkor är uppfyllt, annars 0. - Kom ihåg att ange alias när du refererar till en kolumn, till exempel
ir.IncidentDateellerit.IncidentType!
Interaktiv övning med praktiskt arbete
Testa den här övningen genom att slutföra den här exempelkoden.
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;