ดาวน์แซมเปิลโดยใช้ตาราง Calendar
ฝ่ายบริหารชอบรายงานรายสัปดาห์ แต่ต้องการให้แสดงทุกสัปดาห์ในปี 2020 ไม่ใช่แค่สัปดาห์ที่มีการใช้บริการ เราสามารถแก้ปัญหานี้ได้ด้วยตาราง calendar เนื่องจากตารางนี้ครอบคลุมทุกสัปดาห์ จึงสามารถ JOIN กับตาราง dbo.DaySpaVisit เพื่อหาคำตอบที่ต้องการได้
นอกจากนี้ ฝ่ายบริหารยังต้องการเห็นวันแรกของแต่ละสัปดาห์ปฏิทิน เพื่อให้บริบทที่ชัดเจนแก่ผู้อ่านรายงาน
แบบฝึกหัดนี้เป็นส่วนหนึ่งของหลักสูตร
การวิเคราะห์อนุกรมเวลาใน SQL Server
คำแนะนำการฝึกหัด
- ค้นหาและดึงข้อมูลสัปดาห์ของปีปฏิทินออกมา
- ดึงค่าต่ำสุดของ
c.Dateในแต่ละกลุ่มในชื่อFirstDateOfWeekซึ่งทำได้เนื่องจากเรากำลัง GROUP BY ตามสัปดาห์ - JOIN ตาราง
CalendarกับตารางDaySpaVisitโดยใช้วันที่ของตาราง calendar และวันที่เข้ารับบริการของลูกค้า ทั้งนี้CustomerVisitStartเป็นชนิดDATETIME2ซึ่งรวมเวลาด้วย ดังนั้นการ JOIN โดยตรงจะดึงเฉพาะการเข้าชมที่เริ่มตรงเที่ยงคืนพอดีเท่านั้น - GROUP BY ตามสัปดาห์ของปีปฏิทิน
แบบฝึกหัดเชิงโต้ตอบแบบลงมือทำ
ลองทำแบบฝึกหัดนี้โดยเติมโค้ดตัวอย่างนี้ให้สมบูรณ์
SELECT
-- Determine the week of the calendar year
c.___,
-- Determine the earliest DATE in this group
-- This is NOT the DayOfWeek column
MIN(c.___) AS FirstDateOfWeek,
ISNULL(SUM(dsv.AmenityUseInMinutes), 0) AS AmenityUseInMinutes,
ISNULL(MAX(dsv.CustomerID), 0) AS HighestCustomerID,
COUNT(dsv.CustomerID) AS NumberOfAttendees
FROM dbo.Calendar c
LEFT OUTER JOIN dbo.DaySpaVisit dsv
-- Connect dbo.Calendar with dbo.DaySpaVisit
-- To join on CustomerVisitStart, we need to turn
-- it into a DATE type
ON c.Date = CAST(dsv.___ AS ___)
WHERE
c.CalendarYear = 2020
GROUP BY
-- When we use aggregation functions like SUM or COUNT,
-- we need to GROUP BY the non-aggregated columns
c.___
ORDER BY
c.CalendarWeekOfYear;