Oracle学习笔记:rollup、cube分组函数

一、rollup函数

1.介绍

rollup() 俗名卷起函数,是为 group by() 的扩展函数。

使用语法:group by rollup(a,b)

说明:针对 a 列、b 列分别进行分组,再针对 (a,b) 组合列进行分组,最后汇总。

分组的顺序对结果有影响。

分组统计更加细化。

2.实操

单列分组

平时使用 group by 进行分组汇总的时候,有时还需要进行累计,还得手动再计算一次。

例如:

select corp_name,
       count(1) as cnt
from table_name
group by corp_name

汕头	3389
河源	882
清远	1852
揭阳	1485
深圳	4292
珠海	1953
东莞	16381
梅州	1883
中山	3075
肇庆	1894
云浮	9124
广州	9198
江门	2551
惠州	2103
茂名	1708
潮州	1720
韶关	2815
汕尾	1255
湛江	2540
佛山	2842
阳江	1401

这个时候还想知道全省的累计数据的话,仍需手工计算。

Oracle 提供一个 rollup() 函数可以多添加一行汇总数据。

select nvl(corp_name, '全省') as corp_name
       count(1) as cnt
from table_name
group by rollup(corp_name)

潮州	1720
东莞	16381
佛山	2842
广州	9198
河源	882
惠州	2103
江门	2551
揭阳	1485
茂名	1708
梅州	1883
清远	1852
汕头	3389
汕尾	1255
韶关	2815
深圳	4292
阳江	1401
云浮	9124
湛江	2540
肇庆	1894
中山	3075
珠海	1953
全省	74343  -- 结果多了一行汇总数据

多列分组

针对地市、渠道进行统计汇总,情况如下。

select corp_name,
       channel,
       count(1) as cnt
from table_name
group by corp_name,
         channel

1	广州	电子渠道	5951
2	汕头	其他	935
3	汕尾	电子渠道	1224
4	清远	自有实体	47
5	潮州	电子渠道	884
6	云浮	电子渠道	2612
7	中山	政企直销	178
8	深圳	其他	22
9	韶关	其他	58
10	阳江	其他	4
11	潮州	政企直销	239

利用 rollup() 函数进行汇总。

select corp_name,
       channel,
       count(1) as cnt
from table_name
group by rollup(corp_name,
         channel)

1	潮州	其他	53
2	潮州	电子渠道	884
3	潮州	社会实体	185
4	潮州	政企直销	239
5	潮州	自有实体	359
6	潮州		1720
7	东莞	其他	4417
8	东莞	电子渠道	6266
9	东莞	社会实体	317
10	东莞	政企直销	461
...
91	肇庆		1894
92	中山	其他	62
93	中山	电子渠道	2263
94	中山	政企直销	178
95	中山	自有实体	572
96	中山		3075
97	珠海	其他	752
98	珠海	电子渠道	1201
99	珠海		1953
100			74343

二、cube函数

1.介绍

cube() 函数是维度更细的统计,语法类似于 rollup() 函数。

不同点在于 cube() 首先进行无字段的聚合,再依次对每个字段进行聚合。

2.实操

select corp_name,
       channel,
       count(1) as cnt
from table_name
group by cube(corp_name,
         channel)
         
1			74343
2		其他	12428
3		电子渠道	45951
4		社会实体	2148
5		政企直销	3794
6		自有实体	10022
7	潮州		1720
8	潮州	其他	53
9	潮州	电子渠道	884
10	潮州	社会实体	185
11	潮州	政企直销	239
12	潮州	自有实体	359
13	东莞		16381
14	东莞	其他	4417
15	东莞	电子渠道	6266
16	东莞	社会实体	317
17	东莞	政企直销	461
18	东莞	自有实体	4920
19	佛山		2842
20	佛山	其他	1114

三、对比

假设有 n 个维度,那么 rollup() 函数会有 n 个聚合,cube() 函数会有 2n 个聚合。

  • rollup 统计列

rollup(a,b) 统计列包含:(a,b)、(a)、()

rollup(a,b,c) 统计列包含:(a,b,c)、(a,b)、(a)、()
....

  • cube 统计列

cube(a,b) 统计列包含:(a,b)、(a)、(b)、()

cube(a,b,c) 统计列包含:(a,b,c)、(a,b)、(a,c)、(b,c)、(a)、(b)、(c)、()

参考链接1:Oracle的rollup语句详解

参考链接2:Oracle分组函数之ROLLUP用法

参考链接3:Oracle-rollup()函数

原文地址:https://www.cnblogs.com/hider/p/13856814.html