本文主要是介绍每日一题-9(行程和用户),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题9:
根据下面两个表,写SQL语句查出"2013-10-01"至"2013-10-03"期间非禁止用户(乘客和司机都必须未被禁止)的取消率。
取消率 = 被司机或乘客取消的非禁止用户生成的订单数量/非禁止用户生成的订单总数。
返回结果表中的数据可以按任意顺序组织。其中取消率Cancellation Rate需要四舍五入保留两位小数。
其中:每段行程有唯一 Id ,其中 Client_Id 和 Driver_Id 是 Users 表中 Users_Id 的外键。
其中:非禁止用户即Banned为No的用户,禁止用户即Banned为Yes的用户。
解题思路:
(1)首先确定被禁止用户的行程记录,再剔除这些行程记录。行程表中,字段client id和driverid,都与用户表中的usersid关联。因此只要client id和driver_id中有一个被禁止了,此条行程记录要被剔除。
代码如下:
SELECT *
from Trips as a
join Users as b1 on (a.client_id = b1.users_id and b1.banned ='No')
join Users as b2 on (a.driver_id = b2.users_id and b1.banned ='No')
(2)根据上面的基础上,按日期分组,统计每组的总行程数,取消的行程数。每行程数:COUNT(a.Status)
每组的取消的行程数代码:
SUM(IF(T.Status= 'completed',0,1)
)
最终代码:
SELECT a.request_at AS 'Day', ROUND(SUM(IF(a.Status = 'completed',0,1))/ COUNT(a.Status),2) AS 'Cancellation Rate'
FROM Trips AS a
join Users AS b1 ON (a.client_id = b1.users_id AND b1.banned ='No')
join Users AS b2 ON (a.driver_id = b2.users_id AND b2.banned ='No')
WHERE a.request_at BETWEEN '2013-10-01' AND '2013-10-03'
GROUP BY a.request_at;
这篇关于每日一题-9(行程和用户)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!