SQL中GROUP BY WITH ROLLUP和GROUPING 函数的使用

news/2025/11/10 15:03:52/文章来源:https://www.cnblogs.com/jhdhl/p/19207075
  • WITH ROLLUP:是 SQL 的分组汇总扩展,用于在分组的基础上生成各级别的汇总行,能方便地得到每个分组以及所有分组的总计数据。
  • GROUPING 函数:用于标识某一行是否是由 ROLLUP 生成的汇总行,返回 0 表示是原始数据行,返回 1 表示是汇总行。在 ORDER BY 中使用,可控制结果集的排序,让汇总行以特定顺序呈现。

 

语法结构

SELECT 列1,列2,聚合函数(列3) AS 聚合结果,GROUPING(列1) AS 列1是否为汇总行,GROUPING(列2) AS 列2是否为汇总行
FROM 表名
GROUP BY 列1, 列2 WITH ROLLUP
ORDER BY GROUPING(列1) DESC,列1,GROUPING(列2) DESC,列2;
SELECT ori.org_name,p.product_name,SUM(s.sales_amount) AS total_sales,GROUPING(ori.org_name) AS group_org,GROUPING(p.product_name) AS group_product
FROM sales s
JOIN org_info ori ON s.org_id = ori.org_id
JOIN product p ON s.product_id = p.product_id
WHERE s.created_time <= '2025-11-05 23:59:59'
GROUP BY ori.org_name, p.product_name WITH ROLLUP
ORDER BY GROUPING(ori.org_name) DESC,ori.org_name,GROUPING(p.product_name) DESC,p.product_name;

步骤 2:结果解读

  • 原始分组行:group_org 和 group_product 都为 0,表示这是某机构某产品的具体销售数据。
  • 机构级汇总行:group_org 为 0group_product 为 1,表示该机构所有产品的销售总额。
  • 全量汇总行:group_org 和 group_product 都为 1,表示所有机构所有产品的销售总额。
通过这种方式,你可以高效地获取明细数据和多级汇总数据,无需多次编写单独的汇总查询。
 
实际示例:查询订单信息,根据订单号显示,根据渠道id分组返回小计(汇总行)
其中使用 CASE WHEN GROUPING(t1.orderNo) = 1 THEN '小计' ELSE MAX(t1.channelName) END AS channelName来显示。(是汇总行则显示小计,否则显示原来的渠道名称)
SELECT CASE WHEN GROUPING(t1.orderNo) = 1 THEN NULL ELSE MAX(t1.orderSource) END AS orderSource,CASE WHEN GROUPING(t1.orderNo) = 1 THEN NULL ELSE MAX(t1.channelType) END AS channelType,CASE WHEN GROUPING(t1.orderNo) = 1 THEN NULL ELSE MAX(t1.channelId) END AS channelId,CASE WHEN GROUPING(t1.orderNo) = 1 THEN '小计' ELSE MAX(t1.channelName) END AS channelName,CASE WHEN GROUPING(t1.orderNo) = 1 THEN NULL ELSE t1.orderNo END AS orderNo,SUM(t1.normalVerifyNum + t1.forceVerifyNum + t1.overVerifyNum) AS totalVerifyNum,FORMAT(ROUND(SUM(t1.normalVerifyPrice + t1.forceVerifyPrice + t1.overVerifyPrice), 2), 2) AS totalVerifyPrice,GROUPING(t1.channelId) AS isChannelRollup,GROUPING(t1.orderNo) AS isOrderRollup
FROM (SELECT o.order_source AS orderSource,o.order_channel AS channelType,oi.id channelId,oi.org_name channelName,o.order_no orderNo,o.third_order_no AS thirdOrderNo,o.product_type AS productType,p.product_name AS productName,pp.name AS policyName,CASE WHEN ot.verify_status = 'true' AND ot.offline_verify_sync_status IS NULL THEN 1 ELSE 0 END AS normalVerifyNum,CASE WHEN ot.verify_status = 'true' AND ot.offline_verify_sync_status IS NULL THEN ROUND(IFNULL(ot.act_price, opi.price), 2) ELSE '0.00' END AS normalVerifyPrice,CASE WHEN ot.verify_status = 'true' AND ot.offline_verify_sync_status IS NOT NULL THEN 1 ELSE 0 END AS forceVerifyNum,CASE WHEN ot.verify_status = 'true' AND ot.offline_verify_sync_status IS NOT NULL THEN ROUND(IFNULL(ot.act_price, opi.price), 2) ELSE '0.00' END AS forceVerifyPrice,CASE WHEN ot.verify_status = 'overdue' THEN 1 ELSE 0 END AS overVerifyNum,CASE WHEN ot.verify_status = 'overdue' THEN ROUND(IFNULL(ot.act_price, opi.price), 2) ELSE '0.00' END AS overVerifyPrice,DATE_FORMAT(ot.visit_date, '%Y-%m-%d') playDate,DATE_FORMAT(ot.verify_time, '%Y-%m-%d') verifyDate,ovp.serial_no serialNo,ov.visitor_name AS visitorName,ov.phone_number AS phoneNumber,ov.document_type AS documentType,ov.document_code AS documentCode,ov.email,o.order_type AS orderType,o.payment_type AS paymentType,c.org_name companyName,a.nick_name AS nickName,DATE_FORMAT(ot.verify_time, '%Y-%m-%d %H:%i:%s') AS verifyTime,DATE_FORMAT(o.created_time, '%Y-%m-%d %H:%i:%s') AS place_order_time,opi.price AS priceFROM order_tickets otLEFT JOIN order_info o ON ot.order_id = o.idLEFT JOIN org_info oi ON o.channel_id = oi.idLEFT JOIN order_visitor_product ovp ON ovp.id = ot.visitor_product_idLEFT JOIN product p ON p.id = ot.product_idLEFT JOIN order_product_info opi ON opi.id = ot.order_product_idLEFT JOIN product_policy pp ON pp.id = opi.policy_idLEFT JOIN order_visitor ov ON ov.id = ot.visitor_idLEFT JOIN org_info c ON c.id = o.org_sale_idLEFT JOIN account a ON a.id = o.salesmanWHERE 1=1AND ot.org_sale_id = 1898978223795081217AND ot.verify_status IN ('overdue', 'true')AND ot.verify_time >= DATE_FORMAT('2025-10-01 00:00:00', '%Y-%m-%d %H:%i:%s')AND ot.verify_time <= DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s')AND o.payment_status = 'true'AND o.is_deleted = 'false'AND o.order_status != 'closed'AND o.audit_status = 'success'AND o.parent_pck_id IS NULLAND o.parent_product_type IS NULL
) t1
GROUP BY t1.channelId, t1.orderNo WITH ROLLUP 
HAVING GROUPING(t1.channelId) = 0
ORDER BY t1.channelId, isOrderRollup, MAX(t1.verifyTime) DESC;
View Code

image

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/961422.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

⚡️ 高性能绿色Markdown文档阅读器:Litho Book技能架构深度解析

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

完整教程:深度学习实战:从图像分类到自然语言处理的完整指南

完整教程:深度学习实战:从图像分类到自然语言处理的完整指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Con…

【完整源码+内容集+部署教程】 黄瓜叶片检测系统源码和数据集:改进yolo11-RVB

【完整源码+内容集+部署教程】 黄瓜叶片检测系统源码和数据集:改进yolo11-RVB2025-11-10 14:58 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow…

EasyGBS/EasyNVR高并发适配!PostgreSQL部署指南

EasyGBS/EasyNVR高并发适配!PostgreSQL部署指南在某些部署场景中,例如当客户新部署的EasyGBS或EasyNVR系统需要接入大量设备,或面临高并发访问压力时,我们默认采用的SQLite数据库可能因性能限制而不再适用。为确保…

国产化Word处理控件Spire.Doc教程:使用Java将RTF文件转换为PDF的全面教程

RTF 格式广泛用于文本格式化、字体样式和图片插入,而 PDF(Portable Document Format)则是跨平台文档存储和传输的标准格式,具有高度的兼容性和安全性。本教程将深入介绍如何使用 Spire.Doc for Java 库在 Java 中将…

详细介绍:K8S(七)—— Kubernetes Pod 进阶配置与生命周期管理全解析

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年门卫室岗亭源头厂家综合实力榜单:形象岗亭/小区值班岗亭/钢结构吸烟亭源头厂家精选

门卫室岗亭作为城市管理和企业安保的第一道防线,其市场需求与城市基础设施建设同步增长。数据显示,2024年全国安防行业总产值中,实体防护设施占比约25%,其中标准化与定制化岗亭需求显著提升。本文基于对企业生产能…

2025 11 10

第20场 (为了完整把前天的一部分粘贴过来了T1 秒了 T2 我不行了,啥性质都分析出来了,就是没有想到把第 \(i\) 个物品合并放到第 \(i+1\) 里去,那我能说啥呢见过的套路不够多加上当时的脑袋比较混沌,加上自己比较蠢…

2025 ICPC 南京站 游记

Day -inf zxx 卷文化课不想打。于是组新队,报名南京站。 Day -2 上午在 UCUP 上打了今年的西安站。 写了 \(5\) 个题,最终过了 \(9\) 题,罚时有点多。 Day -1 睡觉 Day 0 上午没打 NFLSPC。 中午打车去了南航,进校…

fastgithub

国内访问GitHub卡顿/打不开?这6种方法亲测有效(附详细操作指南)_github打不开-CSDN博客

2025年工业制冷优质供应商Top 5榜单:专业评测与推荐

摘要 工业制冷行业在2025年持续快速发展,得益于冷链物流、制造业升级和节能环保需求的推动,市场规模预计年增长率超过8%。本文基于用户搜索意图,提供市面上口碑好的工业制冷供应商排名,涵盖维修制冷、螺杆机服务和…

树莓派性能分析脚本

脚本内容 以下是一个包含依赖项说明和安装步骤的脚本: #!/bin/bash# 创建日志文件 LOG_FILE="performance_test.log" echo "System Performance Test Log" > $LOG_FILE echo "----------…

windows客户端配置免密上传代码到gitlab

1.windows客户端为例,我在windows上面生成一个密钥C:\Users\Administrator>ssh-keygen -t rsa -C "1172593152@qq.com" Generating public/private rsa key pair. Enter file in which to save the key (…

2025年餐盒吸塑机批发厂家综合实力榜单:水果盒吸塑机/吸塑成型设备/酒托吸塑成型机源头厂家精选

餐盒吸塑机作为食品包装行业的核心装备,其市场需求与餐饮外卖行业的增长紧密相关。行业数据显示,2024年中国外卖市场规模已超过1万亿元,带动一次性餐盒年消耗量达数百亿只。本文基于对企业技术实力、设备性能、市场…

PDG常见问题

1、首先打开cddt文件,点击Protocol Services,找到对应的诊断服务,如19服务;2、然后右击选择Properties;3、最后点击右侧手指的图标,修改对应寻址方式下的肯定响应抑制位置1或者置0,保存即可。在CANdelaStudio中…

2025年工业制冷供应商综合实力排行榜:专业评测与选择指南

摘要 随着工业制冷行业的快速发展,市场对高效、可靠的制冷解决方案需求日益增长。本文基于行业数据和技术参数,对市面上主流工业制冷供应商进行综合评测,为企业在选择合作伙伴时提供权威参考。文章包含详细的技术分…

现今工业制冷实力厂家评测

摘要 工业制冷行业在2025年持续发展,随着节能减排政策的推进和市场需求增长,高效、可靠的制冷解决方案成为关键。本文基于权威数据和行业洞察,为您推荐排名前五的工业制冷实力厂家,并提供详细评测供参考。表单排名…

日志模块

目录日志模块1、关于记录用户操作日志的几个认知2、关于日志的几个认知3、设计4、例子后端维护日志同一性前端维护日志同一性 日志模块 1、关于记录用户操作日志的几个认知 (1)日志记录内容的设计,应方便后续查询、…

2025年图书馆书架定制生产厂家权威推荐榜单:儿童书架/学生书架/密集书架源头厂家精选

在全民阅读氛围持续升温与图书馆建设标准不断提升的背景下,图书馆书架定制行业正迎来新一轮技术革新与市场需求扩张。行业数据显示,2024年全球图书馆书架系统市场销售额已达1224百万美元,预计到2031年将增长至1485百…

P10581 [蓝桥杯 2024 国 A] 重复的串 题解

单串 ACAM(可能是 KMP 自动机)+ 矩阵优化 dp。 我们设 \(dp_{k,i,j}\) 为当前字符串长为 \(k\),匹配成功 \(i\) 次,字符串结尾为 ACAM 上点 \(j\) 的方案数。 朴素转移是容易的。注意正好匹配时的边界问题。 然后发…