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

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

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练习记录#
全部评论

相关推荐

不愿透露姓名的神秘牛友
昨天 16:32
FieldMatching:看你已读不回是有什么顾虑吗?
点赞 评论 收藏
分享
05-19 15:21
已编辑
华南农业大学 Java
白火同学:你才沟通了200,说实话,北上广深杭这里面你连一座城市的互联网公司都没投满呢,更别说还有各种准一线二线城市了。等你沟通突破了三位数,还没结果再考虑转行的事吧。
点赞 评论 收藏
分享
重生我想学测开:嵌入式的问题,我准备入行京东外卖了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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