一、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()函数