Поєднайте кілька агрегацій в одному запиті
У трьох попередніх вправах ми розглянули оператори групування ROLLUP, CUBE та GROUPING SETS. Із цієї трійки GROUPING SETS є найгнучкішим: він дає змогу побудувати саме ті рівні агрегації, які вам потрібні. GROUPING SETS не робить припущень про ієрархію (на відміну від ROLLUP) і лишається керованим навіть за наявності більшої кількості стовпців (на відміну від 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;