题解 | #有取消订单记录的司机平均评分#

有取消订单记录的司机平均评分

https://www.nowcoder.com/practice/f022c9ec81044d4bb7e0711ab794531a

【思路一】

分别统计不同的结果,然后将结果union,但是不知道为啥只能过一半的实例【????】

以下是错误写法!!!

with tb as
(select
    driver_id
    ,grade
from tb_get_car_order
where date_format(order_time,'%Y-%m') = '2021-10' and driver_id in (select driver_id from tb_get_car_order where fare is null) and grade is not null
) 

(select
    driver_id
    ,round(avg(grade),1) as avg_grade
from tb
group by driver_id
order by driver_id
)
union all
(select 
    '总体' as driver_id
    ,round(avg(grade),1) as avg_grade
from tb   
)     
;

【错误原因分析】

题目要求计算的对象是10月份有取消订单的司机,但是driver_id in (select driver_id from tb_get_car_order where fare is null)计算的司机不一定是10月份取消订单的,应该将时间限制在括号里面。

【正确代码】

with tb as
(select
    driver_id
    ,grade
from tb_get_car_order
where driver_id in (select driver_id from tb_get_car_order where fare is null and date_format(order_time,'%Y-%m') = '2021-10') and grade is not null
) 

(select
    driver_id
    ,round(avg(grade),1) as avg_grade
from tb
group by driver_id
order by driver_id
)
union all
(select 
    '总体' as driver_id
    ,round(avg(grade),1) as avg_grade
from tb   
)     
;

【思路二】

对以上代码进行优化,使用rollup函数

with tb as
(select
    driver_id
    ,grade
from tb_get_car_order
where driver_id in (select driver_id from tb_get_car_order where fare is null and date_format(order_time,'%Y-%m') = '2021-10') and grade is not null
) 

select
    ifnull(driver_id,'总体')
    ,round(avg(grade),1) as avg_grade
from tb
group by driver_id with rollup 
;
#SQL练习记录#
全部评论

相关推荐

03-12 14:52
已编辑
长沙学院 Java
点赞 评论 收藏
分享
03-01 21:45
中北大学 golang
孤蓝长空:请你说一下为什么你用websocket而不是http,请你说一下什么是rpc,为什么用rpc,你的rpc的传输协议是JSON,xml还是什么 请你描述一下你的鉴权流程(完整的) 我问的是第二个项目,随便问的哈哈哈
开工第一帖
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务