当前位置: 首页 > news >正文

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

  • 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.jsqmd.com/news/36604/

相关文章:

  • ⚡️ 高性能绿色Markdown文档阅读器:Litho Book技能架构深度解析
  • 完整教程:深度学习实战:从图像分类到自然语言处理的完整指南
  • 【完整源码+内容集+部署教程】 黄瓜叶片检测系统源码和数据集:改进yolo11-RVB
  • EasyGBS/EasyNVR高并发适配!PostgreSQL部署指南
  • 详细介绍:K8S(七)—— Kubernetes Pod 进阶配置与生命周期管理全解析
  • 2025年门卫室岗亭源头厂家综合实力榜单:形象岗亭/小区值班岗亭/钢结构吸烟亭源头厂家精选
  • 2025 11 10
  • 2025 ICPC 南京站 游记
  • fastgithub
  • 2025年工业制冷优质供应商Top 5榜单:专业评测与推荐
  • 树莓派性能分析脚本
  • windows客户端配置免密上传代码到gitlab
  • 2025年餐盒吸塑机批发厂家综合实力榜单:水果盒吸塑机/吸塑成型设备/酒托吸塑成型机源头厂家精选
  • PDG常见问题
  • 2025年工业制冷供应商综合实力排行榜:专业评测与选择指南
  • 现今工业制冷实力厂家评测
  • 日志模块
  • 2025年图书馆书架定制生产厂家权威推荐榜单:儿童书架/学生书架/密集书架源头厂家精选
  • P10581 [蓝桥杯 2024 国 A] 重复的串 题解
  • AQS 是什么?
  • 2025年军训服定制厂家权威推荐榜单:幼儿园服/迷彩服/校服源头厂家精选
  • 神级项目,Github 上线封神,BettaFish你不可忽视的多Agent舆情分析神器~~~
  • 2025年湖南工商注册公司权威推荐榜单:工商注册流程变更/记账报税服务/代理记账财务源头机构精选
  • 完整教程:每日一个网络知识点:网络层ARP和RARP
  • MyEMS:赋能能源精细化管理的智慧引擎
  • nginx详细配置
  • 2025年新型建筑木方源头厂家综合实力榜单:建筑施工模板/覆膜建筑模板/清水覆膜板生产厂家精选
  • 我开源了一款基于unicloud + uniapp 开发的云端一体小程序:停车寻车助手 - 安雁
  • 污点和容忍度
  • 开源能源管理系统:解锁当下能源困局的关键力量