每日一题-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;

猜你喜欢

转载自blog.csdn.net/Txixi/article/details/121284932