欢迎进入oracle社区论坛,与200万技术人员互动交流 >>进入
rollup和cube语句。
oracle的group
by语句除了最基本的语法外,还支持rollup和cube语句。如果是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()可以美化效果:
oracle的group by语句除了最基本的语法外,还支持rollup和cube语句。
除本文内容外,你还可参考:
分析函数参考手册:
http://xsb.itpub.net/post/419/33028
分析函数使用例子介绍:
http://xsb.itpub.net/post/419/44634
sql> create table t as select * from dba_indexes;
表已创建。
sql> select index_type, status, count(*) from t group by index_type, status;
index_type status count(*)
--------------------------- -------- ----------
lob valid 51
normal n/a 25
normal valid 479
cluster valid 11
下面来看看rollup和cube语句的执行结果。
sql> select index_type, status, count(*) from t group by rollup(index_type, status);
index_type status count(*)
--------------------------- -------- ----------
lob valid 51
lob 51
normal n/a 25
normal valid 479
normal 504
cluster valid 11
cluster 11
566
已选择8行。
sql> select index_type, status, count(*) from t group by cube(index_type, status);
index_type status count(*)
--------------------------- -------- ----------
566
n/a 25
valid 541
lob 51
lob valid 51
normal 504
normal n/a 25
normal valid 479
cluster 11
cluster valid 11
已选择10行。
查询结果不是很一目了然,下面通过oracle提供的函数grouping来整理一下查询结果。
sql> select grouping(index_type) g_ind, grouping(status) g_st, index_type, status, count(*)
2 from t group by rollup(index_type, status) order by 1, 2;
g_ind g_st index_type status count(*)
---------- ---------- --------------------------- -------- ----------
0 0 lob valid 51
0 0 normal n/a 25
0 0 normal valid 479
0 0 cluster valid 11
0 1 lob 51
0 1 normal 504
0 1 cluster 11
1 1 566
已选择8行。
这个查询结果就直观多了,和不带rollup语句的group by相比,rollup增加了对index_type的group by统计和对所有记录的group by统计。
也就是说,如果是rollup(a, b, c)的话,首先会对(a、b、c)进行group by,然后对(a、b)进行group by,然后是(a)进行group by,最后对全表进行group by操作。
下面看看cube语句。
sql> select grouping(index_type) g_ind, grouping(status) g_st, index_type, status, count(*)
2 from t group by cube(index_type, status) order by 1, 2;
g_ind g_st index_type status count(*)
---------- ---------- --------------------------- -------- ----------
0 0 lob valid 51
0 0 normal n/a 25
0 0 normal valid 479
0 0 cluster valid 11
0 1 lob 51
0 1 normal 504
0 1 cluster 11
1 0 n/a 25
1 0 valid 541
1 1 566
已选择10行。
和rollup相比,cube又增加了对status列的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函数,还可以使用grouping_id来标识group by结果。
sql> select grouping_id(index_type, status) g_ind, index_type, status, count(*)
2 from t group by rollup(index_type, status) order by 1;
g_ind index_type status count(*)
---------- --------------------------- -------- ----------
0 lob valid 51
0 normal n/a 25
0 normal valid 479
0 cluster valid 11
1 lob 51
1 normal 504
1 cluster 11
3 566
已选择8行。
sql> select grouping_id(index_type, status) g_ind, index_type, status, count(*)
2 from t group by cube(index_type, status) order by 1;
g_ind index_type status count(*)
---------- --------------------------- -------- ----------
0 lob valid 51
0 normal n/a 25
0 normal valid 479
0 cluster valid 11
1 lob 51
1 normal 504
1 cluster 11
2 n/a 25
2 valid 541
3 566
已选择10行。
grouping_id()可以美化效果:
select decode(grouping_id(c1), 1, '合计', c1) d1,
decode(grouping_id(c1, c2), 1, '小计', c2) d2,
decode(grouping_id(c1, c2, c1 + c2), 1, '小计', c1 + c2) d3,
count(*),
grouping_id(c1, c2, c1 + c2, c1 + 1, c2 + 1),
grouping_id(c1)
from t2
group by rollup(c1, c2, c1 + c2, c1 + 1, c2 + 1);
===========================================================
1.
报表合计专用的
rollup
函数
销售报表
以往的查询
sql:
select
area,month,sum(money) from saleorder group by area,month
[1] [2] [3]