题解 | #某宝店铺的SPU数量#
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,可能不太直观。

查看11道真题和解析