题解 | #有取消订单记录的司机平均评分#
有取消订单记录的司机平均评分
https://www.nowcoder.com/practice/f022c9ec81044d4bb7e0711ab794531a
# 求每人全部已完成的有评分订单的平均分和总体平均分 # 限制:司机是2021年10月有过取消记录的 # 先找到时间段内有取消记录的司机 # 再作为子查询找这些人的所有完成的订单 # 分别求每人的平均分,和总体平均分 SELECT # 使用条件语句对汇总字段和普通字段的值进行分辨 CASE WHEN GROUPING(driver_id) = 1 THEN '总体' ELSE CAST(driver_id AS CHAR) END driver_id, ROUND(AVG(grade), 1) avg_grade FROM tb_get_car_order # 子查询,限定司机是在要求时间范围内有未完成接单的 WHERE driver_id IN ( SELECT driver_id FROM tb_get_car_order WHERE fare IS NULL AND DATE(order_time) BETWEEN '2021-10-01' AND '2021-10-31' ) # 同时查询的是已完成接单的 AND fare IS NOT NULL # 使用GROUPING语句,同时求得小计和合计 GROUP BY driver_id WITH ROLLUP # 排序,GROUPING(driver_id)函数,它在普通行返回0,在汇总行返回1,所以这样正排就能把汇总行放在最下面 ORDER BY GROUPING(driver_id), driver_id;
求合计和小计,传统做法是分别求出合计和小计,前者不用group语句,后者用。
但是使用GROUPING语句就能同时求出。
该语句包括1.ROLLUP 2.CUBE 3.GROUPING SETS
mysql5.5不支持后两个
第一个其他的语言都是直接GROUP BY ROLLUP(driver_id)
mysql是GROUP BY driver_id WITH ROLLUP
在MySQL中,并不存在一个单独的GROUPING
语句,但有一个GROUPING()
函数,这个函数通常与GROUP BY
子句结合使用,尤其是在使用WITH ROLLUP
进行汇总计算时。WITH ROLLUP
是一个强大的功能,它能扩展GROUP BY
语句的功能,用于生成额外的汇总行,这些汇总行代表了更高层次的汇总,直至整个查询结果集的总汇总。
GROUPING()
函数
GROUPING()
函数用于区分普通的GROUP BY
生成的行和由WITH ROLLUP
生成的汇总行。在汇总行中,GROUPING()
函数会返回1
,而在普通行中会返回0
。这对于查询结果的格式化显示非常有用,尤其是当你需要在结果集中明确指出哪些行是汇总行时。
使用场景
当你使用WITH ROLLUP
进行分组汇总时,可能需要在结果集中区分普通分组行和汇总行。GROUPING()
函数正是为此设计,它可以帮助你调整汇总行的显示(例如,通过在选择列表(SELECT list)中使用条件逻辑来显示自定义的文本),或者在ORDER BY
、WHERE
等子句中使用,来对结果进行特定的排序或过滤。
示例
考虑一个简单的例子,假设有一个销售数据表sales
,包含region
、manager
和sales_amount
字段。如果你想要得到每个区域每个经理的销售总额,以及每个区域的销售总额和全体的销售总额,可以使用如下查询:
SELECT region, manager, SUM(sales_amount) AS total_sales, GROUPING(region) AS grp_region, GROUPING(manager) AS grp_manager FROM sales GROUP BY region, manager WITH ROLLUP
在这个例子中:
GROUPING(region)
和GROUPING(manager)
会为普通分组行返回0
,为汇总行返回1
。- 通过检查
grp_region
和grp_manager
的值,你可以确定哪些行是针对每个经理的汇总(grp_manager = 1
)、哪些行是针对每个区域的汇总(grp_region = 1
且grp_manager = 1
),以及哪一行是全体的总汇总(grp_region = 1
)。
注意事项
GROUPING()
函数在SELECT
列表中、ORDER BY
子句中或者在HAVING
子句中使用时非常有用,因为它可以帮助你根据行是普通分组行还是汇总行来调整逻辑处理。- 使用
WITH ROLLUP
时,MySQL会按照GROUP BY
子句中列出的顺序,从右到左依次添加汇总行。了解这一点对于预测汇总行的层次结构和顺序非常重要。
通过这种方式,MySQL的GROUPING()
函数和WITH ROLLUP
提供了一种灵活的方法来执行数据的多层次汇总,这对于报表生成和数据分析来说是非常有价值的工具。