Несколько агрегирований в одном запросе
В трёх предыдущих упражнениях мы рассмотрели операторы группировки ROLLUP, CUBE и GROUPING SETS. Из них GROUPING SETS — наиболее гибкий: он позволяет задать именно те уровни агрегирования, которые вам нужны. В отличие от ROLLUP, GROUPING SETS не предполагает иерархии, а в отличие от CUBE — остаётся удобным в работе даже при большом числе столбцов.
В этом упражнении мы проверим несколько гипотез на основе наших данных:
- После введения обучения в ноябре 2019 года количество инцидентов в месяц сократилось.
- По вторникам инцидентов происходит больше, чем в остальные будние дни.
- В выходные дни инцидентов происходит больше, чем в будние.
Это упражнение является частью курса
Анализ временных рядов в SQL Server
Инструкции к упражнению
Заполните наборы группировки в соответствии с приведёнными выше гипотезами. Помимо общего итога, добавьте следующие наборы:
- один набор — по календарному году и месяцу;
- один набор — по дню недели;
- один набор — по признаку выходного или рабочего дня.
Интерактивное практическое упражнение
Попробуйте выполнить это упражнение, дополнив этот пример кода.
SELECT
c.CalendarYear,
c.CalendarMonth,
c.DayOfWeek,
c.IsWeekend,
SUM(ir.NumberOfIncidents) AS NumberOfIncidents
FROM dbo.IncidentRollup ir
INNER JOIN dbo.Calendar c
ON ir.IncidentDate = c.Date
GROUP BY GROUPING SETS
(
-- Each non-aggregated column from above should appear once
-- Calendar year and month
(___, ___),
-- Day of week
(___),
-- Is weekend or not
(___),
-- This remains empty; it gives us the grand total
()
)
ORDER BY
c.CalendarYear,
c.CalendarMonth,
c.DayOfWeek,
c.IsWeekend;