首页 > 大数据 > 正文

实例演示:Oracle ROLLUP和CUBE用法

2012-06-21 14:13:07  来源:比特网

摘要:Oracle的GROUP BY语句除了最基本的语法外,还支持ROLLUP和CUBE语句。如果是Group by ROLLUP(A, B, C)的话,首先会对(A、B、C)进行GROUP BY,然后对(A、B)进行GROUP BY,然后是(A)进行GROUP BY...
关键词: Oracle

    1、Oracle ROLLUP和CUBE 用法


    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操作。


    如果是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),…… 这样任意按自己想要的形式结合统计数据,非常方便。


    2、实例


    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);


    GRADE SUM(NUM)


    ---------- ----------


    a 3


    b 8


    11


    同时对grade和id字段进行rollup


    SQL> SELECT decode(grouping_id(grade,ID),2,'小计',3,'合计',grade) grade,


[page]    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个字段起作用的


[page]    可以认为你理解的是只对第一个字段的累计,跟GROUP BY grade,rollup(ID)的结果很接近,再看rollup3个字段的情况:


    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


[page]    p2 c 小计 5


    p2 d 6 6


    p2 d 小计 6


    p2 小计 小计 11


    总计 总计 总计 21


    13 rows selected


    这里不光只对第一个字段做了累计,先按(part,grade,ID)分组累计,然后按(part,grade)分组累计,再按(part)分组累计,最后累计全部


    再看看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


第三十八届CIO班招生
国际CIO认证培训
首席数据官(CDO)认证培训
责编:liangxuejuan

免责声明:本网站(http://www.ciotimes.com/)内容主要来自原创、合作媒体供稿和第三方投稿,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所提供信息的准确性及可靠性,但不保证有关资料的准确性及可靠性,读者在使用前请进一步核实,并对任何自主决定的行为负责。本网站对有关资料所引致的错误、不确或遗漏,概不负任何法律责任。
本网站刊载的所有内容(包括但不仅限文字、图片、LOGO、音频、视频、软件、程序等)版权归原作者所有。任何单位或个人认为本网站中的内容可能涉嫌侵犯其知识产权或存在不实内容时,请及时通知本站,予以删除。