SQL架构
表:Trips
id 是这张表的主键。
这张表中存所有出租车的行程信息。每段行程有唯一 id ,其中 client_id 和 driver_id 是 Users 表中 users_id 的外键。
status 是一个表示行程状态的枚举类型,枚举成员为(‘completed’, ‘cancelled_by_driver’, ‘cancelled_by_client’) 。
表:Users
users_id 是这张表的主键。
这张表中存所有用户,每个用户都有一个唯一的 users_id ,role 是一个表示用户身份的枚举类型,枚举成员为 (‘client’, ‘driver’, ‘partner’) 。
banned 是一个表示用户是否被禁止的枚举类型,枚举成员为 (‘Yes’, ‘No’) 。
取消率 的计算方式如下:(被司机或乘客取消的非禁止用户生成的订单数量) / (非禁止用户生成的订单总数)。
写一段 SQL 语句查出 “2013-10-01” 至 “2013-10-03” 期间非禁止用户(乘客和司机都必须未被禁止)的取消率。非禁止用户即 banned 为 No 的用户,禁止用户即 banned 为 Yes 的用户。
返回结果表中的数据可以按任意顺序组织。其中取消率 Cancellation Rate 需要四舍五入保留 两位小数 。
查询结果格式如下例所示。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/trips-and-users
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
/* Write your T-SQL query statement below */
select a.request_at Day,Convert(decimal(12,2),Convert(decimal(12,2),isnull(b.num,0)) / Convert(decimal(12,2),isnull(a.num,1))) as [Cancellation Rate] from --取消率
(select a.request_at,count(1) num from Trips a --有效订单数
left join Users b on a.client_id = b.users_id
left join Users c on a.driver_id = c.users_id
where b.banned <> 'Yes' and c.banned <> 'Yes'
group by a.request_at) a
left join ( select a.request_at,count(1) num from Trips a --有效订单取消数
left join Users b on a.client_id = b.users_id
left join Users c on a.driver_id = c.users_id
where b.banned <> 'Yes' and c.banned <> 'Yes' and a.status <> 'completed'
group by a.request_at) b
on a. request_at = b.request_at
where a.request_at >= '2013-10-01' and a.request_at < '2013-10-04'
1.订单表用司机和乘客id分别关联用户表,过滤掉禁用的用户,根据日期group by,获得日期总订单数,日期,封装成子查询表T1。
2.订单表用司机和乘客id分别关联用户表,过滤掉禁用的用户,并且订单状态不等于完成,根据日期group by,获得日期总有效用户取消订单数,日期,封装成子查询表T2。
3.根据日期关联有效总订单T1表和有效取消订单T2表,Convert(decimal(12,2),isnull(T2有效取消订单数,0)) / Convert(decimal(12,2),isnull(T1总有效订单数,1))) as [Cancellation Rate]