
Oracle 的 rollup、cube、grouping sets 函数
Oracle 的 group by 除了基本用法以外,还有 3 种扩展用法,分别是 rollup、cube、grouping sets。
1 rollup
假设有一个表 test,有 A、B、C、D、E5 列。
如果使用 group by rollup(A,B,C),首先会对(A、B、C)进行 GROUP BY,然后对(A、B)进行 GROUP
BY,然后是(A)进行 GROUP BY,最后对全表进行 GROUP BY 操作。roll up 的意思是“卷起”,
这也可以帮助我们理解 group by rollup 就是对选择的列从右到左以一次少一列的方式进行
grouping 直到所有列都去掉后的 grouping(也就是全表 grouping),对于 n 个参数的 rollup,有
n+1 次的 grouping。以下 2 个 sql 的结果集是一样的:
Select A,B,C,sum(E) from test group by rollup(A,B,C)
与
Select A,B,C,sum(E) from test group by A,B,C
union all
Select A,B,null,sum(E) from test group by A,B
union all
Select A,null,null,sum(E) from test group by A
union all
Select null,null,null,sum(E) from test
2 cube
cube 的意思是立方,对 cube 的每个参数,都可以理解为取值为参与 grouping 和不参与
grouping 两个值的一个维度,然后所有维度取值组合的集合就是 grouping 的集合,对于 n
个参数的 cube,有 2^n 次的 grouping。如果使用 group by cube(A,B,C),,则首先会对(A、B、
C)进行 GROUP BY,然后依次是(A、B),(A、C),(A),(B、C),(B),(C),最后对全表进行 GROUP
BY 操作,一共是 2^3=8 次 grouping。同 rollup 一样,也可以用基本的 group by 加上结果集
的 union all 写出一个与 group by cube 结果集相同的 sql:
Select A,B,C,sum(E) from test group by cube(A,B,C);
评论