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_id
是NULL
,那么它会返回字符串"总体"
。
在这段SQL代码中,WITH ROLLUP
子句会在结果集中添加一个汇总行,该行通常包含 NULL
值作为分组键。这意味着,除了按每个司机ID分组外,还会有一个额外的行,代表所有司机的平均等级。由于这个额外的行的 driver_id
字段将是 NULL
,因此使用 IFNULL
将其替换为 "总体"
,以便更好地理解和标识这个汇总行。
例如,假设 GROUP BY driver_id WITH ROLLUP
导致结果集中有一行 driver_id
是 NULL
,代表所有司机的平均等级,那么这一行就会显示为:
| driver_id | avg_grade |
|-----------|-----------|
| 总体 | 4.5 |
这样可以清楚地表明这是所有司机的整体平均等级。如果没有使用 IFNULL
,那么 driver_id
将显示为 NULL
,可能不太直观。