ПочатиПочніть безкоштовно

Обчислення агрегатів з фільтрацією

Якщо потрібно порахувати кількість появ події за певними критеріями фільтрації, можна скористатися агрегатними функціями, як-от SUM(), MIN() і MAX(), а також виразами CASE. Наприклад, SUM(CASE WHEN ir.IncidentTypeID = 1 THEN 1 ELSE 0 END) поверне кількість інцидентів, пов'язаних із типом інциденту 1. Якщо додати по одному виразу SUM() для кожного типу інциденту, ви фактично виконаєте зведення (pivot) за ідентифікатором типу інциденту.

У цій ситуації керівництво хоче отримати від нас, у розрізі типів інцидентів, скільки було днів із «великими інцидентами» порівняно з «малими інцидентами». Керівництво визначає день із великими інцидентами як такий, коли було понад 5 випадків одного й того самого типу інциденту протягом дня, а день із малими інцидентами — коли від 1 до 5.

Ця вправа є частиною курсу

Аналіз часових рядів у SQL Server

Переглянути курс

Інструкції до вправи

  • Заповніть вираз CASE, який дасть змогу використати функцію SUM() для обчислення кількості днів із великими та малими інцидентами.
  • У виразі CASE повертайте 1, якщо відповідний критерій фільтра виконано, і 0 — інакше.
  • Обов'язково вказуйте псевдонім під час посилання на стовпці, наприклад ir.IncidentDate або it.IncidentType!

Інтерактивна практична вправа

Спробуйте виконати цю вправу, доповнивши цей зразок коду.

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;
Редагувати та запускати код