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

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

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

发现大家多使用IFNULL函数或者Coalesce函数,在本道题目中虽然可行,但有一个潜在问题其实是会被忽略的(但该问题不会对本道题造成影响),即:当driver_id为NULL的时候,IFNULL、COALESCE则会将driver_id IS NULL的行也填充为“总计”(当然,ROLLUP出来的小计行也会照样填充“总计”)——但是,因为tb_get_car_order表中driver_id 是设置NOT NULL约束,因此不会出现上述问题。

就我个人而言,为了应对特殊情况(如上述的driver_id可为NULL)和可移植性,我会使用GROUPING来写:

SELECT (CASE WHEN GROUPING(driver_id) = 1 THEN '总体' ELSE driver_id END) AS driver_id,
       ROUND(AVG(grade),1) AS avg_grade
FROM tb_get_car_order
WHERE driver_id IN (SELECT driver_id
                    FROM tb_get_car_order
                    WHERE start_time IS NULL
                    AND DATE(order_time ) BETWEEN '2021-10-01' AND '2021-10-31')
GROUP BY driver_id WITH ROLLUP
-- ORDER BY GROUPING(driver_id) ASC, driver_id ASC;

最后的“ORDER BY GROUPING(driver_id) ASC, driver_id ASC;” 可加可不加,加了更保险,因为我也不确定MySQL 8.0中的ROLLUP,是不是就一定会使合计行出现在每层分组的的最后一行。

因此我使用ORDER GROUPING(driver_id)来确保合计行一定在最后一行——当然,我这个解决方法也是针对只GROUP by driver_id一列的这一情况来写的,若GROUP BY两列及以上就不适用了。

全部评论
请问筛选司机编号的子查询为啥不用加表名,加上表名就出错
点赞 回复 分享
发布于 2023-07-11 09:57 北京

相关推荐

11-04 22:56
已编辑
门头沟学院 Java
点赞 评论 收藏
分享
苗条的伊泽瑞尔最喜欢...:同28届被压力了,电科✌就不能去卷算法吗?把Java留给我们双非卷
投递快手等公司10个岗位
点赞 评论 收藏
分享
评论
14
收藏
分享

创作者周榜

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