1. 程式人生 > 實用技巧 >Oracle學習筆記:rollup、cube分組函式

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()函式