Oracle的group by除了基本使用方法之外,还有3种扩展使用方法,各自是rollup、cube、grouping sets。分别介绍例如如下:数据库
一、rollupio
对数据库表emp。若是当中两个字段名为a,b,c。扩展
假设使用group by rollup(a,b),首先会对(a,b)进行group by ,而后对 a 进行 group by 。最后对全表进行 group by 操做。select
例如如下查询结果:rollup
查询语句二进制
Select deptno,job,sum(sal) from emp group by rollup(deptno,job);nio
等同于方法
Select deptno,job,sum(sal) from emp group by deptno,jobim
union all统计
Select deptno,null sum(sal) from emp group by deptno
union all
Select null,null,sum(sal) from emp (group by null )
二、cube
假设使用group by cube(a,b),,则首先会对(a,b)进行group by,而后依次是(a),(b),最后对全表进行group by 操做,一共是2^2=4次grouping
例如如下查询结果。
查询语句
Select deptno,job,sum(sal) from emp group by cube(deptno,job);
等同于
Select deptno,job,sum(sal) from emp group by deptno,job
union all
Select deptno,null sum(sal) from emp group by deptno
union all
Select null,job, sum(sal) from emp group by job
union all
Select null,null,sum(sal) from emp (group by null )
三、grouping sets
grouping sets就是对參数中的每个參数作grouping。假设使用group by grouping sets(a,b)。则对(a),(b)进行group by
例如如下查询结果:
查询语句
Select deptno,job,sum(sal) from emp group by cube(deptno,job);
等同于
select null,job,sum(sal) from emp group by job
union all
select deptno,null,sum(sal) from emp group by deptno
四、grouping
使用grouping可以推断该行是数据库中原本的行,仍是有统计产生的行。grouping值为0时说明这个值是数据库中原本的值。为1说明是统计的结果,參数仅仅有一个,而且必须为group by中出现的某一列
例如如下查询结果:
查询语句
select deptno,job,sum(sal),grouping(deptno) a,grouping(job) b from emp group by rollup(deptno,job);
五、grouping_id
Grouping_id()的返回值事实上就是參数中的每列的grouping()值的二进制向量。假设grouping(a)=1,grouping(b)=1,则grouping_id(A,B)的返回值就是二进制的11。转成10进制就是3。
參数可以是多个,但必须为group by中出现的列。
查询结果例如如下:
查询语句
select deptno,job,sum(sal),grouping(deptno) a,grouping(job) b,grouping_id(deptno,job) from emp group by rollup(deptno,job);
六、group_id
GROUP_ID()惟一标识反复组,可以经过group_id去除反复组
查询结果例如如下:
查询语句
select deptno,job,sum(sal),group_id() from emp group by deptno, rollup(deptno,job) having group_id()=0;