# 求每人全部已完成的有评分订单的平均分和总体平均分
# 限制:司机是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提供了一种灵活的方法来执行数据的多层次汇总,这对于报表生成和数据分析来说是非常有价值的工具。

京公网安备 11010502036488号