该文章转自:http://xls.iteye.com/blog/1096711
Oracle的group by除了基本用法以外,还有3种扩展用法,分别是rollup、cube、grouping sets。
SQL> create table t(a number,b
number,c number,d number);
表已创建。
SQL> commit;
提交完成。
SQL> select * from t;
---------- ---------- ---------- ----------
1 rollup
假设有一个表test,有A、B、C、D、E5列。
如 果使用group by rollup(A,B,C),首先会对(A、B、C)进行GROUP BY,然后对(A、B)进行GROUP BY,然后是(A)进行GROUP BY,最后对全表进行GROUP BY操作。roll up的意思是“卷起”,这也可以帮助我们理解group by rollup就是对选择的列从右到左以一次少一列的方式进行grouping直到所有列都去掉后的grouping(也就是全表grouping),对于 n个参数的rollup,有n+1次的grouping。以下2个sql的结果集是一样的:
Select A,B,C,sum(E) from test group by rollup(A,B,C)
与
Select A,B,C,sum(E) from test group by A,B,C
union all
Select A,B,null,sum(E) from test group by A,B
union all
Select A,null,null,sum(E) from test group by A
union all
Select null,null,null,sum(E) from test
example1:
SQL> select a,b from t group by
rollup(a,b);-----rollup(a,b)
---------- ----------
已选择9行。
SQL> select a,b from t group by a,b;-----group by a,b
---------- ----------
SQL> select a,null as b from t group by a;------group by a
---------- -
SQL> select a,b from t group by a,b