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

全部评论
好像没有过滤时间,10月有过取消订单的司机
点赞 回复 分享
发布于 2022-04-06 16:03

相关推荐

点赞 评论 收藏
分享
Noob1024:一笔传三代,人走笔还在
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务