LeetCode题库 数据库分类 困难 262. 行程和用户 MS SQL解法 答案

最近在刷leetcode题库,刚好看到中文网站已经上线了,新增了ms sql解释器。困难难度链接在这,就顺便吐槽一下这个中文名字吧。 [ 力扣题库 ]


262. 行程和用户

Trips 表中存所有出租车的行程信息。每段行程有唯一健 Id,Client_Id 和 Driver_Id 是 Users 表中 Users_Id 的外键。Status 是枚举类型,枚举成员为 (‘completed’, ‘cancelled_by_driver’, ‘cancelled_by_client’)。

Id Client_Id Driver_Id City_Id Status Request_at
1 1 10 1 completed 2013-10-01
2 2 11 1 cancelled_by_driver 2013-10-01
3 3 12 6 completed 2013-10-01
4 4 13 6 cancelled_by_client 2013-10-01
5 1 10 1 completed 2013-10-02
6 2 11 6 completed 2013-10-02
7 3 12 6 completed 2013-10-02
8 2 12 12 completed 2013-10-03
9 3 10 12 completed 2013-10-03
10 4 13 12 cancelled_by_driver 2013-10-03

Users 表存所有用户。每个用户有唯一键 Users_Id。Banned 表示这个用户是否被禁止,Role 则是一个表示(‘client’, ‘driver’, ‘partner’)的枚举类型。

Users_Id Banned Role
1 No client
2 Yes client
3 No client
4 No client
10 No driver
11 No driver
12 No driver
13 No driver

写一段 SQL 语句查出 2013年10月1日 至 2013年10月3日 期间非禁止用户的取消率。基于上表,你的 SQL 语句应返回如下结果,取消率(Cancellation Rate)保留两位小数。

Day Cancellation Rate
2013-10-01 0.33
2013-10-02 0.00
2013-10-03 0.50

解法

select [request_at] as [Day],round(count(case when status like 'cancel%' then status end)*1.00/count(*),2) as [Cancellation Rate] 
from trips 
where client_id in (select users_id from users where banned like 'no')  
and driver_id in (select users_id from users where banned like 'no')  
and convert(datetime,[Request_at]) between '2013-10-1' and '2013-10-3'
group by [request_at] 

解题思路

  1. 用case when语句把取消订单数量算出来。
  2. users表中banned列值是‘Yes’的用户id在trips表中司机id列和用户id列中刨掉。
  3. 注意时间列的类型转换。

*如有问题,敬请留言。

你可能感兴趣的:(SQL)