问题262:Trips
表中存所有出租车的行程信息。每段行程有唯一键Id
,Client_Id
和Driver_Id
是Users
表中Users_Id
的外键。Status
是枚举类型,枚举成员为 ‘completed’, ‘cancelled_by_driver’, ‘cancelled_by_client’
。
Users
表存所有用户。每个用户有唯一键Users_Id
。Banned
表示这个用户是否被禁止,Role
则是一个表示‘client’, ‘driver’, ‘partner’
的枚举类型。
写一段 SQL 语句查出 2013年10月1日 至 2013年10月3日 期间非禁止用户的取消率。基于上表,你的 SQL 语句应返回如下结果,取消率(Cancellation Rate)保留两位小数。
取消率的计算方式如下:(被司机或乘客取消的非禁止用户生成的订单数量) / (非禁止用户生成的订单总数)
这题先把三个表Inner Join
,舍弃掉被禁止的用户和司机。
然后用CASE WHEN ... THEN ... ELSE ... END
。
完整代码:
SELECT tab1.Request_at AS 'Day',
ROUND(SUM(CASE WHEN tab1.Status = 'completed'
THEN 0 ELSE 1 END)
/COUNT(tab1.Id),2)
AS 'Cancellation Rate'
FROM Trips AS tab1
INNER JOIN Users AS tab2
ON tab1.Client_Id = tab2.Users_Id
INNER JOIN Users AS tab3
On tab1.Driver_Id = tab3.Users_Id
WHERE tab1.Request_at BETWEEN '2013-10-01' AND '2013-10-03'
AND tab2.Banned = 'No'
AND tab3.Banned = 'No'
GROUP BY tab1.Request_at
运行结果: