我们用一个生活中的例子来理解,比如你开了家小超市,想统计「销售额」,但需要从多个角度看(比如按 “日期 + 商品”、“仅日期”、“仅商品”、“整体总销售额”)。

假设你的销售数据长这样(简化版):

日期商品销售额
2023-10-01可乐100
2023-10-01薯片80
2023-10-02可乐120
2023-10-02薯片90

你想同时得到 4 种统计结果:

  1. 按「日期 + 商品」统计(最明细的维度);
  2. 仅按「日期」统计(每天总销售额);
  3. 仅按「商品」统计(每种商品总销售额);
  4. 不按任何维度(整体总销售额)。

不用 GROUPING SETS 的话,你需要写 4 个查询,再合并:

-- 1. 日期+商品
SELECT 日期, 商品, SUM(销售额) FROM 销售表 GROUP BY 日期, 商品
UNION ALL
-- 2. 仅日期
SELECT 日期, 'ALL' 商品, SUM(销售额) FROM 销售表 GROUP BY 日期
UNION ALL
-- 3. 仅商品
SELECT 'ALL' 日期, 商品, SUM(销售额) FROM 销售表 GROUP BY 商品
UNION ALL
-- 4. 整体汇总
SELECT 'ALL' 日期, 'ALL' 商品, SUM(销售额) FROM 销售表

用 GROUPING SETS 的话,1 条查询搞定:

SELECT -- 用GROUPING判断列是否参与分组,不参与就显示'ALL'IF(GROUPING(日期) = 0, 日期, 'ALL') AS 日期,IF(GROUPING(商品) = 0, 商品, 'ALL') AS 商品,SUM(销售额) AS 总销售额
FROM 销售表
-- 一次性指定所有要统计的维度组合
GROUP BY 日期, 商品
GROUPING SETS ((日期, 商品),  -- 对应需求1:日期+商品(日期),        -- 对应需求2:仅日期(商品),        -- 对应需求3:仅商品()             -- 对应需求4:不分组(整体汇总)
)

最终结果长这样:

日期商品总销售额
2023-10-01可乐100-- 日期 + 商品维度
2023-10-01薯片80-- 日期 + 商品维度
2023-10-02可乐120-- 日期 + 商品维度
2023-10-02薯片90-- 日期 + 商品维度
2023-10-01ALL180-- 仅日期维度(100+80)
2023-10-02ALL210-- 仅日期维度(120+90)
ALL可乐220-- 仅商品维度(100+120)
ALL薯片170-- 仅商品维度(80+90)
ALLALL390-- 整体汇总(180+210 或 220+170)

核心点总结:

  • GROUPING SETS(...):括号里写多个 “维度组合”,一次查询得到所有组合的统计结果(代替多次GROUP BY+UNION ALL)。
  • GROUPING(列名):判断这一列是否在当前行的 “维度组合” 中。如果在(参与了分组),返回 0,显示实际值;如果不在(是汇总行),返回 1,用 'ALL' 标记,方便区分。

————————————

        我们用一个更贴近实际业务的例子来说明:假设你有一张「订单表」,需要统计不同维度的销量,同时保留一个固定的分组字段(比如「月份」),并穿插普通查询字段和GROUPING处理的字段,看看它们的区别。

场景设定

订单表orders结构(简化):

月份(month)地区(region)产品(product)销量(sales)
2023-09华北手机100
2023-09华北电脑50
2023-09华南手机80
2023-10华北手机120
2023-10华南电脑60

需求

统计每个月的销量,同时按以下维度组合分析:

  1. 月份 + 地区 + 产品(最明细)
  2. 月份 + 地区(不区分产品)
  3. 月份 + 产品(不区分地区)
  4. 月份(不区分地区和产品)

要求结果中:

  • 保留「月份」作为固定显示的普通字段;
  • 「地区」和「产品」用GROUPING处理,不参与分组时显示'ALL'
  • 计算总销量。

SQL 查询(包含普通字段和 GROUPING 字段)

SELECT -- 普通字段:月份(始终在GROUP BY中,直接显示实际值)month,-- GROUPING处理的字段:地区(是否参与分组动态显示)IF(GROUPING(region) = 0, region, 'ALL') AS region,-- GROUPING处理的字段:产品(是否参与分组动态显示)IF(GROUPING(product) = 0, product, 'ALL') AS product,-- 聚合字段:总销量SUM(sales) AS total_sales
FROM orders
-- 固定按月份分组,同时用GROUPING SETS定义地区和产品的组合
GROUP BY month,
GROUPING SETS ((region, product),  -- 组合1:月份+地区+产品(region),           -- 组合2:月份+地区(无产品)(product),          -- 组合3:月份+产品(无地区)()                  -- 组合4:仅月份(无地区和产品)
)
ORDER BY month, region, product;

查询结果

monthregionproducttotal_sales
2023-09华北手机100-- 组合 1:月份 + 地区 + 产品
2023-09华北电脑50-- 组合 1:月份 + 地区 + 产品
2023-09华北ALL150-- 组合 2:月份 + 地区(汇总该地区所有产品)
2023-09华南手机80-- 组合 1:月份 + 地区 + 产品
2023-09华南ALL80-- 组合 2:月份 + 地区(汇总该地区所有产品)
2023-09ALL手机180-- 组合 3:月份 + 产品(汇总所有地区该产品)
2023-09ALL电脑50-- 组合 3:月份 + 产品(汇总所有地区该产品)
2023-09ALLALL230-- 组合 4:仅月份(汇总该月所有销量)
2023-10华北手机120-- 组合 1:月份 + 地区 + 产品
2023-10华北ALL120-- 组合 2:月份 + 地区(汇总该地区所有产品)
2023-10华南电脑60-- 组合 1:月份 + 地区 + 产品
2023-10华南ALL60-- 组合 2:月份 + 地区(汇总该地区所有产品)
2023-10ALL手机120-- 组合 3:月份 + 产品(汇总所有地区该产品)
2023-10ALL电脑60-- 组合 3:月份 + 产品(汇总所有地区该产品)
2023-10ALLALL180-- 组合 4:仅月份(汇总该月所有销量)

普通字段 vs GROUPING 处理的字段:核心区别

  1. 普通字段(如month

    • 必须出现在GROUP BY中(否则 SQL 会报错,因为非聚合字段必须参与分组)。
    • 其值是「固定分组维度」,在所有结果行中都显示实际值(如2023-092023-10),不会被替换为'ALL'
    • 作用:作为所有统计维度的 “基础锚点”(比如这里所有统计都基于 “月份” 展开)。
  2. GROUPING 处理的字段(如regionproduct

    • 不一定在所有分组组合中出现(由GROUPING SETS控制)。
    • 其值是「动态分组维度」:当参与当前分组时显示实际值(如华北手机),不参与时显示'ALL'(表示该维度被汇总)。
    • 作用:灵活切换不同维度的统计视角,同时用'ALL'清晰标记 “当前行是该维度的汇总结果”。

        简单说:普通字段是 “固定不变的分组锚点”,GROUPING 处理的字段是 “可开关的动态维度”,前者值固定,后者值随分组组合动态变化(实际值或汇总标记)。

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

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

相关文章

C语言第五课:if、else 、if else if else 控制语句

C语言第五课&#xff1a;if、else 、if else if else 控制语句if else 、if else if else 联合使用编程快速学习平台if else 、if else if else 联合使用 代码示列 #include <stdio.h> int main(){//设置中文编码输出到控制台system("chcp 65001");//今天星…

七彩喜智慧养老:用科技温暖晚年,让关爱永不掉线

“当银发潮遇见科技力&#xff0c;养老方式正在发生一场静悄悄的变革。”你有没有想过&#xff1a;当父母年迈独居时&#xff0c;如何确保他们的安全&#xff1f;当老人突然摔倒&#xff0c;如何第一时间获得救助&#xff1f;当慢性病需要长期管理&#xff0c;如何避免频繁奔波…

window显示驱动开发—为头装载和专用监视器生成自定义合成器应用(二)

显示相关的 API 的比较 API用途和目标受众DisplayInformation用于检索 CoreWindow 的呈现和布局属性。HdmiDisplayInformation用于枚举和设置受限模式集的仅限 Xbox 的 API。 高度专用于 Xbox 媒体应用方案。DisplayMonitor用于查询物理监视器设备的属性。 不公开有关操作系统…

Linux 高性能 I/O 事件通知机制的核心系统调用—— `epoll_ctl`

epoll 是 Linux 上处理大量文件描述符 I/O 事件的高效模型&#xff0c;而 epoll_ctl 则是你用来指挥 epoll 实例&#xff08;epoll instance&#xff09;的“遥控器”&#xff0c;负责向它添加、修改或删除需要监视的文件描述符&#xff08;FD&#xff09;及其感兴趣的事件。1.…

mysql 必须在逗号分隔字符串和JSON字段之间二选一,怎么选

如果必须在逗号分隔字符串和JSON字段之间二选一&#xff0c;那么 JSON字段是明显更好的选择。以下是详细的对比分析&#xff1a;对比结论&#xff08;直接看这里&#xff09;方面JSON字段逗号分隔字符串胜出方查询能力✅ 丰富的JSON函数支持❌ 只能使用LIKE模糊查询JSON数据验证…

DPI和DIP的区别

DPI 和 DIP 是两个在计算机图形和移动开发领域常见的术语&#xff0c;它们都与屏幕显示和尺寸有关&#xff0c;但含义和用途不同。 DPI (Dots Per Inch) 定义&#xff1a;DPI 的全称是 Dots Per Inch&#xff0c;即每英寸点数。它是一个衡量物理密度的单位&#xff0c;表示在…

数据帮助我们理解未知世界

主持人 尼古拉安根&#xff1a; 大家好&#xff0c;我是挪威南方财富基金首席执行官尼古拉安根。今天非常荣幸能与大卫斯皮格尔哈尔特爵士对话。坦率地说&#xff0c;他不仅是世界上最优秀的统计学家之一&#xff0c;也是我见过的最佳风险沟通者。他撰写了大量优秀著作&#xf…

在使用git的很多操作是保持工作区干净

这是一条铁律下面是错误操作&#xff1a;自己明明写完了代码&#xff0c;想要提交。此时你的工作区长这样你的提交顺序是&#xff1a;git pull -> git commit -> git push但是现实往往不这样&#xff0c;万一拉下来的代码和你当前工作区的代码有冲突&#xff0c;你必须要…

通过语法推导树快速求短语,简单短语和句柄

第一步&#xff1a;写出规范推导&#xff08;最右&#xff09;序列 规范推导就是最右推导。我们的目标是从起始符号 E 出发&#xff0c;通过每步替换最右边的非终结符&#xff0c;最终得到句型 R(Pi)。 文法 G[E]: E :: RP | PP :: (E) | iR :: RP | RP* | P | P* 推导过程&…

智能学习辅助系统-部门管理开发

文章目录准备工作工程搭建增删改查查询部门删除部门新增部门修改部门查询回显修改数据日志技术准备工作 需求&#xff1a;部门管理的查询、新增、修改、删除 使用REST风格的URL&#xff1a; GET &#xff1a; 查询POST &#xff1a;新增PUT &#xff1a; 修改DELETE &#x…

【图解】idea中快速查找maven冲突

现象 今天启动项目时&#xff0c;总是以下报错&#xff0c;并退出SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/F:/.m2/repository/org/apache/logging/log4j/log4j-slf4j-impl/2.13.3/log4j-slf4j-impl-2.13.3.jar!/org/slf4j/im…

LightGBM、XGBoost和CatBoost自定义损失函数和评估指标

LightGBM、XGBoost和CatBoost自定义损失函数和评估指标函数&#xff08;缩放误差&#xff09;数学原理损失函数定义梯度计算评估指标LightGBM实现自定义损失函数自定义评估指标使用方式XGBoost实现自定义损失函数自定义评估指标使用方式CatBoost实现自定义损失函数自定义评估指…

2025-09-08升级问题记录: 升级SDK从Android11到Android12

将 Android 工程的 targetSdkVersion 从 30 &#xff08;Android 11&#xff09;升级到 31&#xff08;Android 12&#xff09;需要关注一些重要的行为变更和适配点。 主要适配要点&#xff1a; 适配类别关键变更点适配紧迫性简要说明组件导出属性声明了 Intent Filter 的组件…

利用OpenCV实现模板与多个对象匹配

代码实现&#xff1a;import cv2 import numpy as npimg_rgb cv2.imread(mobanpipei.jpg) img_gray cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY) template cv2.imread(jianto.jpg, flags0) h, w template.shape[:2]# 读取图像# # 顺时针旋转 90 度&#xff08;k1&#xff0…

OS28.【Linux】自制简单的Shell的修bug记录

目录 1.问题代码 2.排查 前期检查 查找是谁修改了environ[0] 使用gdb下断点 查看后续的影响 分析出问题的split_commandline函数 3.反思 4.正确代码 5.结论 6.除此之外...... ★提示: 此bug非常隐蔽,不仔细分析很难查出问题,非常锻炼调试能力! 1.问题代码 #includ…

Debian 系统上安装与配置 MediaMTX

&#x1f3af; 在 Debian 系统上安装与配置 MediaMTX&#xff08;原 rtsp-simple-server&#xff09;&#xff1a;打造轻量级流媒体服务器 作者&#xff1a;远在太平洋 环境&#xff1a;Debian 10/11/12 | Ubuntu 可参考 关键词&#xff1a;MediaMTX、rtsp-simple-server、RTSP…

分布式专题——10.4 ShardingSphere-Proxy服务端分库分表

1 为什么要有服务端分库分表&#xff1f; ShardingSphere-Proxy 是 ShardingSphere 提供的服务端分库分表工具&#xff0c;定位是“透明化的数据库代理”。 它模拟 MySQL 或 PostgreSQL 的数据库服务&#xff0c;应用程序&#xff08;Application&#xff09;只需像访问单个数据…

Mysql相关的面试题1

什么是聚集索引&#xff08;聚簇索引&#xff09;&#xff1f;什么是二级索引&#xff08;非聚簇索引&#xff09;&#xff1f; 聚集索引就是叶子节点关联行数据的索引&#xff0c;二级索引就是叶子节点关联主键的索引&#xff0c;聚集索引必须有且仅有一个&#xff0c;二级索引…

电涌保护器:为现代生活筑起一道隐形防雷网

何为电涌保护器&#xff1f;电涌保护器&#xff08;Surge Protective Device&#xff0c;简称SPD&#xff09;主要用于控制信号系统&#xff0c;保护电气电子设备信号线路免受雷电电磁脉冲、感应过电压、操作过电压的影响&#xff0c;广泛应用于工控、消防、安防监控、交通、电…

【uniapp微信小程序】扫普通链接二维码打开小程序

需求&#xff1a;用户A保存自己的邀请码海报&#xff0c;用户B扫描该普通连接二维码&#xff0c;打开微信小程序&#xff0c;并且携带用户A的邀请码信息&#xff0c;用户B登录时&#xff0c;跟用户A关联&#xff0c;成为用户A的下级。 tips&#xff1a;保存海报到手机相册可以参…