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

ดาวน์แซมเปิลโดยใช้ตาราง 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;
แก้ไขและรันโค้ด