select tt.Day,convert(sum(IF(tt.status='cancelled_by_driver' or tt.status='cancelled_by_client',total,0))/sum(IF(tt.status is not null,total,0)),decimal(10,2))
as 'CancellationRate'
from (
select t.request_at Day,t.status,count(1) total
from Trips t
inner join Users s
on t.client_id = s.users_id
where s.banned ='No'
and t.request_at >=str_to_date('2013-10-01', '%Y-%m-%d')
and t.request_at <=str_to_date('2013-10-03', '%Y-%m-%d')
group by t.request_at,t.status
)tt
group by tt.Day
提交答案
相比leetcode 上的预期结果,我觉得自己的输出结果更符合开发实际需要,同时反思SQL的编写过程更有意义:1. group by 自带去重效果,故上面SQL 需要有字段 count(1) total ;2. convert()函数用于将值从一种数据类型转换为另一种数据类型;3. IF()函数用于验证条件 IF(condition, true_value, false_value);4. 字符串与日期转换函数:STR_TO_DATE() ,DATE_FORMAT()