Combine várias agregações em uma única consulta
Nos três últimos exercícios, vimos os operadores de agrupamento ROLLUP, CUBE e GROUPING SETS. Dentre eles, GROUPING SETS é o mais personalizável, permitindo construir exatamente os níveis de agregação que você quiser. GROUPING SETS não pressupõe hierarquia (ao contrário de ROLLUP) e se mantém administrável mesmo com um bom número de colunas (ao contrário de CUBE).
Neste exercício, queremos testar algumas hipóteses com nossos dados:
- Temos observado menos incidentes por mês desde a introdução do treinamento em novembro de 2019.
- Mais incidentes ocorrem na terça-feira do que nos outros dias úteis.
- Mais incidentes ocorrem nos fins de semana do que nos dias úteis.
Este exercício faz parte do curso
Análise de Séries Temporais no SQL Server
Instruções do exercício
Complete os grouping sets com base nas hipóteses acima. Queremos ver os seguintes grouping sets além do total geral:
- Um conjunto por ano e mês do calendário
- Um conjunto por dia da semana
- Um conjunto por indicação de fim de semana ou não
Exercício interativo prático
Experimente este exercício completando este código de exemplo.
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;