union 是在order by之前进行的,因此对单表进行order by使用括号即可 我在每次添加合计行的时候就会添加临时表,这样在数据较大的情况下可以减少查询次数增加效率,

with d_id as (select driver_id,grade from tb_get_car_order
              where driver_id in 
(select driver_id from tb_get_car_order
where finish_time is not null and 
      start_time is null) ) 
      
(select driver_id,round(avg(grade),1)
from d_id
group by driver_id
order by driver_id)
union
select "总体" ,round(avg(grade),1)
from d_id 
 

也可以使用ifnull 搭配 with rollup 方法 在这个SQL查询中,IFNULL 函数用于处理可能为 NULL 的值。具体来说,这里的 IFNULL(driver_id, "总体") 表达式的功能如下:

  • 如果 driver_id 不是 NULL,那么它会直接返回 driver_id 的值。
  • 如果 driver_idNULL,那么它会返回字符串 "总体"

在这段SQL代码中,WITH ROLLUP 子句会在结果集中添加一个汇总行,该行通常包含 NULL 值作为分组键。这意味着,除了按每个司机ID分组外,还会有一个额外的行,代表所有司机的平均等级。由于这个额外的行的 driver_id 字段将是 NULL,因此使用 IFNULL 将其替换为 "总体",以便更好地理解和标识这个汇总行。

例如,假设 GROUP BY driver_id WITH ROLLUP 导致结果集中有一行 driver_idNULL,代表所有司机的平均等级,那么这一行就会显示为:

| driver_id | avg_grade |
|-----------|-----------|
| 总体      | 4.5       |

这样可以清楚地表明这是所有司机的整体平均等级。如果没有使用 IFNULL,那么 driver_id 将显示为 NULL,可能不太直观。