Calcularea agregatelor filtrate
Dacă vrem să numărăm aparițiile unui eveniment în funcție de anumite criterii de filtrare, putem folosi funcții de agregare precum SUM(), MIN() și MAX(), împreună cu expresii CASE. De exemplu, SUM(CASE WHEN ir.IncidentTypeID = 1 THEN 1 ELSE 0 END) returnează numărul de incidente asociate cu tipul de incident 1. Dacă incluzi câte o instrucțiune SUM() pentru fiecare tip de incident, ai pivotat setul de date după ID-ul tipului de incident.
În acest scenariu, conducerea vrea să știe, pentru fiecare tip de incident, câte zile au fost „zile cu incidente majore" și câte au fost „zile cu incidente minore". O zi cu incidente majore este definită ca având mai mult de 5 apariții ale aceluiași tip de incident în aceeași zi, iar o zi cu incidente minore are între 1 și 5 apariții.
Acest exercițiu face parte din cursul
Analiza seriilor de timp în SQL Server
Instrucțiuni pentru exercițiu
- Completează o expresie
CASEcare să îți permită să folosești funcțiaSUM()pentru a calcula numărul de zile cu incidente majore și zile cu incidente minore. - În expresia
CASE, returnează 1 dacă criteriul de filtrare corespunzător este îndeplinit și 0 în caz contrar. - Asigură-te că specifici aliasul atunci când faci referire la o coloană, de exemplu
ir.IncidentDatesauit.IncidentType!
Exercițiu interactiv practic
Încearcă acest exercițiu completând acest cod de exemplu.
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;