Obliczanie agregacji z filtrowaniem
Jeśli chcemy policzyć liczbę wystąpień jakiegoś zdarzenia spełniającego określone kryteria, możemy skorzystać z funkcji agregujących, takich jak SUM(), MIN() i MAX(), w połączeniu z wyrażeniami CASE. Na przykład SUM(CASE WHEN ir.IncidentTypeID = 1 THEN 1 ELSE 0 END) zwróci liczbę incydentów powiązanych z typem incydentu 1. Jeśli dodasz po jednej instrukcji SUM() dla każdego typu incydentu, przestawisz (spivottujesz) zbiór danych według identyfikatora typu incydentu.
W tym scenariuszu kierownictwo chce wiedzieć, ile było dni „dużych incydentów", a ile dni „małych incydentów" – z podziałem na typy incydentów. Dzień dużych incydentów to taki, w którym ten sam typ incydentu wystąpił więcej niż 5 razy. Dzień małych incydentów to taki, w którym ten sam typ incydentu wystąpił od 1 do 5 razy.
To ćwiczenie jest częścią kursu
Analiza szeregów czasowych w SQL Server
Instrukcje do ćwiczenia
- Uzupełnij wyrażenie
CASE, które pozwoli użyć funkcjiSUM()do obliczenia liczby dni dużych i małych incydentów. - W wyrażeniu
CASEzwróć 1, jeśli odpowiednie kryterium filtrowania jest spełnione, i 0 w przeciwnym razie. - Pamiętaj, aby przy odwoływaniu się do kolumn podawać alias, np.
ir.IncidentDatelubit.IncidentType!
Interaktywne ćwiczenie praktyczne
Spróbuj tego ćwiczenia, uzupełniając ten przykładowy kod.
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;