题解 | #有取消订单记录的司机平均评分#

有取消订单记录的司机平均评分

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 BYWHERE等子句中使用,来对结果进行特定的排序或过滤。

示例

考虑一个简单的例子,假设有一个销售数据表sales,包含regionmanagersales_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_regiongrp_manager的值,你可以确定哪些行是针对每个经理的汇总(grp_manager = 1)、哪些行是针对每个区域的汇总(grp_region = 1grp_manager = 1),以及哪一行是全体的总汇总(grp_region = 1)。

注意事项

  • GROUPING()函数在SELECT列表中、ORDER BY子句中或者在HAVING子句中使用时非常有用,因为它可以帮助你根据行是普通分组行还是汇总行来调整逻辑处理。
  • 使用WITH ROLLUP时,MySQL会按照GROUP BY子句中列出的顺序,从右到左依次添加汇总行。了解这一点对于预测汇总行的层次结构和顺序非常重要。

通过这种方式,MySQL的GROUPING()函数和WITH ROLLUP提供了一种灵活的方法来执行数据的多层次汇总,这对于报表生成和数据分析来说是非常有价值的工具。

全部评论

相关推荐

求个公司要我:接好运
点赞 评论 收藏
分享
2024-12-23 12:44
门头沟学院 Java
黑皮白袜臭脚体育生:简历统一按使用了什么技术实现了什么功能解决了什么问题或提升了什么性能来写,如使用标签实现了兴趣推送,提升了用户黏性另外宣传下自己的开源仿b站微服务项目,GitHub已经390star,牛客上有完整文档教程,如果觉得有帮助的话可以点个小星星,蟹蟹
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务