GROUPING 区分汇总行
GROUPING(列) 用来区分普通行与超级聚合行:配合 WITH ROLLUP 或 GROUPING SETS 使用时,小计与合计行返回 1,普通行返回 0。它的价值是把「本来就是 NULL」和「因为汇总而显示为空」分开,报表里不至于把合计行当成某个具体分组。
基本信息
| 返回值 | 0 表示普通行,1 表示该列被汇总的超聚合行 |
|---|---|
| 使用前提 | 查询里要用 ROLLUP 或 GROUPING SETS |
| 适用平台 | MySQL 8 与 PostgreSQL 均可用 |
| 用途 | 标注汇总行、过滤小计与合计 |
| 配套语法 | GROUPING SETS、ROLLUP、CUBE |
典型使用场景
- 报表里标注「合计」这类标签
- 把合计行排除在明细统计之外
- 多层小计:城市小计加全国合计
- 输出到前端时区分汇总层级
- 排查合计行与真实 NULL 混淆导致的口径错误
示例
示例
-- WITH ROLLUP 生成小计与合计行,用 GROUPING 区分
SELECT city,
GROUPING(city) AS is_total, -- 1 表示这行是汇总行
COUNT(*) AS cnt
FROM users
GROUP BY city WITH ROLLUP;
-- 只保留明细行,过滤掉小计与合计
SELECT city, COUNT(*) AS cnt
FROM users
GROUP BY city WITH ROLLUP
HAVING GROUPING(city) = 0;相关语法的作用
| 语法 | 生成什么 | 配合 GROUPING 做什么 |
|---|---|---|
| WITH ROLLUP | 逐层小计加总合计行 | 标注汇总行、过滤汇总行 |
| GROUPING SETS | 指定多组分组组合 | 分辨当前行属于哪一组 |
| CUBE | 所有列组合的汇总 | 在多维分析里定位汇总层级 |
| 单独 GROUP BY | 只有普通行 | GROUPING 恒为 0,没有意义 |
没有 ROLLUP 或 GROUPING SETS 时 GROUPING() 没有意义:它只在超级聚合行返回 1,普通分组查询上给不出有用信息。
报表排序要一并处理:汇总行默认按分组键排,可能插在明细中间。通常在 ORDER BY 里加上汇总行标记,让合计行稳定落在末尾。
把结果输出到前端时建议额外给一个层级标记列:只提供汇总标记、让前端自己推断层级,遇到多层汇总时很容易展示错位。
不同实现对 GROUPING 参数的接受度有差异:有的支持一次判断多个列,有的只接受单个列,跨库写法前先按目标库的语法验证一遍。