子查询: 子查询首先执行,它的目的是找出所有在2021年10月有未定义票价的司机ID。
SELECT driver_id FROM tb_get_car_order
:选择司机ID。WHERE DATE_FORMAT(order_time, "%Y-%m")='2021-10'
:条件限制了只有2021年10月的订单。AND ISNULL(fare)
:条件进一步限制了只有那些票价为NULL的订单。外部查询: 外部查询使用子查询的结果,并计算这些司机的平均评分。
SELECT IFNULL(driver_id, "总体") as driver_id, ROUND(AVG(grade), 1) as avg_grade
:这里使用了IFNULL
函数,如果driver_id
为NULL(这将在WITH ROLLUP
生成的总计行中发生),则将其替换为"总体"。同时,计算平均评分(AVG(grade)
)并四舍五入到小数点后一位。FROM tb_get_car_order
:指定了查询的表。WHERE driver_id in (...)
:条件限制了只有子查询中找到的司机ID。AND NOT ISNULL(grade)
:条件排除了那些没有评分的订单。GROUP BY driver_id
:按照司机ID对结果进行分组。WITH ROLLUP
:这个修饰符会在分组的结果基础上再进行一次额外的汇总,即对分组的结果进行小计和总计。最终,这个查询返回了每个符合条件司机的平均评分,以及一个总计行,显示了所有符合条件的司机的平均评分。总计行的司机ID列将显示为"总体"。
select ifnull(driver_id, "总体") 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 date_format(order_time, "%Y-%m") = '2021-10' and isnull(fare)
) and not isnull(grade)
group by driver_id
with rollup;