Oracle SQL中ROLLUP分组统计如何使用

梦萱酱_9411

梦萱酱_9411

2026-08-09

527人浏览

原创

rollup是对group by的扩展,用于自动生成多级小计和总计;其分组顺序决定层级结构,null是汇总标记需用grouping()区分,混用需谨慎,适用报表多级汇总场景。

oracle sql中rollup分组统计如何使用

ROLLUP 不是用来“替代 GROUP BY”的,而是对 GROUP BY 的扩展——它自动补全多级小计和总计,省掉写一堆 UNION ALL 的麻烦。用错地方或忽略细节,反而会让结果多出 NULL 行、排序混乱、甚至聚合值错误。

ROLLUP 的分组顺序决定结果层级

ROLLUP(a, b, c) 生成的分组是严格从左到右递减的: - 先按 a, b, c 分组(最细粒度) - 再按 a, b 分组(c 小计) - 再按 a 分组(b,c 小计) - 最后按空分组(a,b,c 总计)

这意味着:ROLLUP(dept, job) 能看到“某部门某岗位 → 某部门总计 → 全部总计”,但 ROLLUP(job, dept) 就变成“某岗位某部门 → 某岗位总计 → 全部总计”,语义完全不同。别只看字段名,盯住括号里的顺序。

NULL 值不是脏数据,是 ROLLUP 的标记位

ROLLUP 产生的汇总行里,未参与当前分组的列会显示为 NULL。比如 GROUP BY ROLLUP(class, student) 中: - class = 'A', student = 'Alice' → 正常明细 - class = 'A', student = NULL → A 班所有学生的小计 - class = NULL, student = NULL → 全表总计

这些 NULL 不能直接过滤掉,否则就丢了汇总行。需要用 GROUPING() 函数区分真 NULL 和汇总占位符:

Crypto Sniper Oracle
Crypto Sniper Oracle

机构级量化市场预言机,提供订单簿失衡(OBI)、VWAP分析、自动化报告及Telegram预警。

下载
SELECT 
  CASE WHEN GROUPING(class) = 1 THEN '全部班级' ELSE class END AS class,
  CASE WHEN GROUPING(student) = 1 THEN '小计/总计' ELSE student END AS student,
  SUM(grades)
FROM t_student_grades
GROUP BY ROLLUP(class, student)

ROLLUP 和普通 GROUP BY 混用容易翻车

写成 GROUP BY class, ROLLUP(student, subject) 是合法的,但它等价于: - GROUP BY class, student, subject - GROUP BY class, student - GROUP BY class

注意:最外层的 class 是固定分组维度,不会被 ROLLUP “卷起”。这种写法适合“先按某维度锁定,再对其子维度做汇总”,但初学者常误以为它能跨维度叠加,结果发现少了一层总计。

性能比 UNION ALL 好,但别在大表上盲目套用

ROLLUP 底层通常只需一次扫描 + 排序,比多个 UNION ALL 子查询快。但代价是: - 必须对所有 ROLLUP 列做排序(哪怕加了索引,也可能触发 SORT GROUP BY) - 如果只想要某一层小计(比如只要部门小计,不要岗位小计),却写了 ROLLUP(dept, job),Oracle 仍会计算全部层级,浪费资源

真正该用 ROLLUP 的场景,是报表导出、BI 后端一次性拉取多级汇总;日常查单条明细或简单聚合,硬套 ROLLUP 反而拖慢响应。

ROLLUP 的核心不是“炫技”,是让层级汇总变得可预测、可维护。最容易被忽略的,其实是 GROUPING() ——没它,你根本分不清哪一行是真数据、哪一行是它帮你算出来的汇总。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

3803

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

811

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

989

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

5621

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

2583

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

5600

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

7361

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1010

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

872

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程