group by 拓展

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;

相關文章
相關標籤/搜索