เริ่มต้นใช้งานเริ่มต้นใช้งานได้ฟรี

รวมการ aggregate หลายรูปแบบไว้ในคิวรีเดียว

ในสามแบบฝึกหัดที่ผ่านมา เราได้ศึกษา grouping operator ทั้งสามตัวได้แก่ ROLLUP, CUBE และ GROUPING SETS ในบรรดาทั้งสามตัวนี้ GROUPING SETS มีความยืดหยุ่นสูงที่สุด เพราะช่วยให้กำหนดระดับการ aggregate ได้อย่างตรงตามต้องการ ต่างจาก ROLLUP ที่ถือว่าคอลัมน์มีลำดับชั้น และต่างจาก CUBE ที่อาจซับซ้อนเกินไปเมื่อมีคอลัมน์จำนวนมาก

ในแบบฝึกหัดนี้ เราต้องการทดสอบสมมติฐานหลายข้อจากข้อมูล:

  1. จำนวนเหตุการณ์ต่อเดือนลดลงหลังจากเริ่มโปรแกรมฝึกอบรมในเดือนพฤศจิกายน 2019
  2. วันอังคารมีเหตุการณ์เกิดขึ้นมากกว่าวันอื่นในสัปดาห์
  3. วันหยุดสุดสัปดาห์มีเหตุการณ์เกิดขึ้นมากกว่าวันทำการ

แบบฝึกหัดนี้เป็นส่วนหนึ่งของหลักสูตร

การวิเคราะห์อนุกรมเวลาใน 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;
แก้ไขและรันโค้ด