Zacznij terazZacznij za darmo

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

Zobacz kurs

Instrukcje do ćwiczenia

  • Uzupełnij wyrażenie CASE, które pozwoli użyć funkcji SUM() do obliczenia liczby dni dużych i małych incydentów.
  • W wyrażeniu CASE zwróć 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.IncidentDate lub it.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;
Edytuj i uruchom kod