รวมการ aggregate หลายรูปแบบไว้ในคิวรีเดียว
ในสามแบบฝึกหัดที่ผ่านมา เราได้ศึกษา grouping operator ทั้งสามตัวได้แก่ ROLLUP, CUBE และ GROUPING SETS ในบรรดาทั้งสามตัวนี้ GROUPING SETS มีความยืดหยุ่นสูงที่สุด เพราะช่วยให้กำหนดระดับการ aggregate ได้อย่างตรงตามต้องการ ต่างจาก ROLLUP ที่ถือว่าคอลัมน์มีลำดับชั้น และต่างจาก CUBE ที่อาจซับซ้อนเกินไปเมื่อมีคอลัมน์จำนวนมาก
ในแบบฝึกหัดนี้ เราต้องการทดสอบสมมติฐานหลายข้อจากข้อมูล:
- จำนวนเหตุการณ์ต่อเดือนลดลงหลังจากเริ่มโปรแกรมฝึกอบรมในเดือนพฤศจิกายน 2019
- วันอังคารมีเหตุการณ์เกิดขึ้นมากกว่าวันอื่นในสัปดาห์
- วันหยุดสุดสัปดาห์มีเหตุการณ์เกิดขึ้นมากกว่าวันทำการ
แบบฝึกหัดนี้เป็นส่วนหนึ่งของหลักสูตร
การวิเคราะห์อนุกรมเวลาใน SQL Server
คำแนะนำการฝึกหัด
กำหนด grouping set ตามสมมติฐานข้างต้น โดยนอกจาก grand total แล้ว ให้ระบุ grouping set ดังนี้:
- ชุดหนึ่งตามปีและเดือนในปฏิทิน
- ชุดหนึ่งตามวันในสัปดาห์
- ชุดหนึ่งตามว่าวันนั้นเป็นวันหยุดสุดสัปดาห์หรือไม่
แบบฝึกหัดเชิงโต้ตอบแบบลงมือทำ
ลองทำแบบฝึกหัดนี้โดยเติมโค้ดตัวอย่างนี้ให้สมบูรณ์
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;