จุดรับผู้โดยสารตามกะการทำงาน
ถึงเวลาแก้โจทย์ข้อที่สองของกรณีศึกษาแล้ว — AvgFarePerKM, RideCount และ TotalRideMin ของแต่ละจุดรับผู้โดยสารและกะการทำงานภายใน Borough ของ NYC มีค่าเท่าใด?
แบบฝึกหัดนี้เป็นส่วนหนึ่งของหลักสูตร
การเขียนฟังก์ชันและ Stored Procedures ใน SQL Server
คำแนะนำการฝึกหัด
- สร้าง stored procedure ชื่อ
cuspPickupZoneShiftStatsที่รับ@Borough nvarchar(30)เป็น input parameter และกรองเฉพาะระเบียนที่มีค่าBoroughตรงกัน - คำนวณ
'Shift'โดยส่งค่าhourของPickupDateไปยังฟังก์ชันdbo.GetShiftNumber()โดยใช้ฟังก์ชันDATEPARTเพื่อดึงเฉพาะส่วนhourของPickupDate - จัดกลุ่มตามวันในสัปดาห์ของ
PickupDate, กะการทำงาน และ Zone - เรียงลำดับตามวันในสัปดาห์ของ
PickupDate(โดยให้วันจันทร์ขึ้นก่อน), กะการทำงาน และTotalRideMin
แบบฝึกหัดเชิงโต้ตอบแบบลงมือทำ
ลองทำแบบฝึกหัดนี้โดยเติมโค้ดตัวอย่างนี้ให้สมบูรณ์
-- Create the stored procedure
CREATE PROCEDURE dbo.cuspPickupZoneShiftStats
-- Specify @Borough parameter
@Borough nvarchar(30)
AS
BEGIN
SELECT
DATENAME(WEEKDAY, PickupDate) as 'Weekday',
-- Calculate the shift number
___.___(___(___, ___)) as 'Shift',
Zone.Zone as 'Zone',
FORMAT(AVG(dbo.ConvertDollar(TotalAmount, .77)/dbo.ConvertMiletoKM(TripDistance)), 'c', 'de-de') AS 'AvgFarePerKM',
FORMAT(COUNT (ID),'n', 'de-de') as 'RideCount',
FORMAT(SUM(DATEDIFF(SECOND, PickupDate, DropOffDate))/60, 'n', 'de-de') as 'TotalRideMin'
FROM YellowTripData
INNER JOIN TaxiZoneLookup as Zone on PULocationID = Zone.LocationID
WHERE
dbo.ConvertMiletoKM(TripDistance) > 0 AND
Zone.Borough = @Borough
GROUP BY
DATENAME(WEEKDAY, PickupDate),
-- Group by shift
___.___(___(___, ___)),
Zone.Zone
ORDER BY CASE WHEN DATENAME(WEEKDAY, PickupDate) = 'Monday' THEN 1
WHEN DATENAME(WEEKDAY, PickupDate) = 'Tuesday' THEN 2
WHEN DATENAME(WEEKDAY, PickupDate) = 'Wednesday' THEN 3
WHEN DATENAME(WEEKDAY, PickupDate) = 'Thursday' THEN 4
WHEN DATENAME(WEEKDAY, PickupDate) = 'Friday' THEN 5
WHEN DATENAME(WEEKDAY, PickupDate) = 'Saturday' THEN 6
WHEN DATENAME(WEEKDAY, PickupDate) = 'Sunday' THEN 7 END,
-- Order by shift
___.___(___(___, ___)),
SUM(DATEDIFF(SECOND, PickupDate, DropOffDate))/60 DESC
END;