Oracle的GROUP BY語句除了最基本的語法外,還支持ROLLUP和CUBE語句。
若是是Group by ROLLUP(A, B, C)的話,首先會對(A、B、C)進行GROUP BY,而後對(A、B)進行GROUP BY,而後是(A)進行GROUP BY,最後對全表進行GROUP BY操做。 www.2cto.com
若是是GROUP BY CUBE(A, B, C),則首先會對(A、B、C)進行GROUP BY,而後依次是(A、B),(A、C),(A),(B、C),(B),(C),最後對全表進行GROUP BY操做。 grouping_id()能夠美化效果。除了使用GROUPING函數,還能夠使用GROUPING_ID來標識GROUP BY的結果。
也能夠 Group by Rollup(A,(B,C)) ,Group by A Rollup(B,C),…… 這樣任意按本身想要的形式結合統計數據,很是方便。
二、實例
SQL> select grade,id,num from a;
GRADE ID NUM
---------- ---------- ----------
a 1 1
a 2 2
b 3 4
b 4 4
對grade字段進行rollup:
SQL> select grade,sum(num) from a group by rollup(grade);
www.2cto.com
GRADE SUM(NUM)
---------- ----------
a 3
b 8
11
同時對grade和id字段進行rollup
SQL> SELECT decode(grouping_id(grade,ID),2,'小計',3,'合計',grade) grade,
2 decode(grouping_id(grade,ID),1,'小計',3,'合計',ID) ID,
3 SUM(num)
4 FROM a GROUP BY ROLLUP(grade,ID)
5 /
GRADE ID SUM(NUM)
---------- ---------- ----------
a 1 1
a 2 2
a 小計 3
b 3 4
b 4 4
b 小計 8
合計 合計 11
7 rows selected
再看看先對grade分組,再對id進行rollup的狀況:
SQL> SELECT grade,
2 decode(GROUPING(ID),1,'合計',ID) ID,
3 SUM(num)
4 FROM a GROUP BY grade,rollup(ID)
5 /
GRADE ID SUM(NUM)
---------- ---------- ----------
a 1 1
a 2 2
a 合計 3
b 3 4
b 4 4
b 合計 8
6 rows selected
這裏GROUP BY grade,rollup(ID)跟你的理解應該很相近了,並且能夠看出GROUP BY grade,rollup(ID)結果跟ROLLUP(grade,ID)很相似,只是少了最後1行總合計,可是也能夠就看出rollup多個字段時並非只有1個字段起做用的
能夠認爲你理解的是隻對第一個字段的累計,跟GROUP BY grade,rollup(ID)的結果很接近,再看rollup3個字段的狀況: www.2cto.com
SQL> select part,grade,id,num from a;
PART GRADE ID NUM
---- ---------- ---------- ----------
p1 a 1 1
p1 a 2 2
p1 b 3 3
p1 b 4 4
p2 c 5 5
p2 d 6 6
6 rows selected
SQL>
SQL> SELECT decode(grouping_id(part,grade,ID),7,'總計',part) part,
2 decode(grouping_id(part,grade,ID),3,'小計',7,'總計',grade) grade,
3 decode(grouping_id(part,grade,ID),1,'小計',3,'小計',7,'總計',ID) ID,
4 SUM(num)
5 FROM a GROUP BY ROLLUP(part,grade,ID)
6 /
PART GRADE ID SUM(NUM)
---- ---------- ---------- ----------
p1 a 1 1
p1 a 2 2
p1 a 小計 3
p1 b 3 3
p1 b 4 4
p1 b 小計 7
p1 小計 小計 10
p2 c 5 5
p2 c 小計 5
p2 d 6 6
p2 d 小計 6
p2 小計 小計 11
總計 總計 總計 21
13 rows selected
這裏不光只對第一個字段作了累計,先按(part,grade,ID)分組累計,而後按(part,grade)分組累計,再按(part)分組累計,最後累計所有 www.2cto.com
再看看rollup 和 cube的區別:
對於ROLLUP(part,grade,ID),grouping_id(part,grade,ID)的值範圍在(0,1,3,7)間即
part,grade,ID(做爲合計時計爲1)
0,0,0
0,0,1
0,1,1
1,1,1
而對於cube(part,grade,ID),grouping_id(part,grade,ID)的值範圍在0-7之間即
part,grade,ID(做爲合計時計爲1)
0,0,0
0,0,1
0,1,0
0,1,1
1,0,0
1,0,1
1,1,0