发现大家多使用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两列及以上就不适用了。