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)、()
四、MySQL语法
MySQL中语法与Oracle稍微有点不同。
SELECT to_city,
COUNT(1) AS cnt
FROM tb_out_spring_data
GROUP BY to_city
WITH ROLLUP
rollup 相对于 union all 性能上有极大的提升。
参考链接1:Oracle的rollup语句详解
参考链接2:Oracle分组函数之ROLLUP用法
参考链接3:Oracle-rollup()函数
参考链接4:mysql - rollup 使用
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
2019-10-22 LeetCode:595.大的国家
2019-10-22 LeetCode:176.第二高的薪水
2019-10-22 LeetCode:182.查找重复的电子邮箱