Oracle高階查詢之GROUP BY

2021-06-13 10:20:37 字數 3358 閱讀 4713

為了方便大家學習和測試,所有的例子都是在oracle自帶使用者scott下建立的。

現在客戶的需求是統計部門中每種工作的工資總額,最後還需要統計所有人的工資總數,相信這樣的需求對大家來說還是比較簡單的,很快就能寫出sql語句,如下:

[sql]view plain

copy

select

deptno, job, 

sum(sal)  

from

scott.emp  

group

bydeptno, job  

order

bydeptno  

union

allselect

null

deptno, 

null

job, 

sum(sal) 

from

scott.emp;  

客戶拍了一下腦袋瓜(當成西瓜拍了),再統計每個部門的工資數吧。****,我加乙個union all搞定,修改後的sql語句如下:

[sql]view plain

copy

select

deptno, job, 

sum(sal)  

from

scott.emp  

group

bydeptno, job  

union

allselect

deptno, 

null

job, 

sum(sal)  

from

scott.emp  

group

bydeptno  

union

allselect

null

deptno, 

null

job, 

sum(sal) 

from

scott.emp;  

老師批註:為什麼要寫的這麼囉嗦呢?其實有更簡介的語句可以實現同樣的功能,看好了:

[sql]view plain

copy

select

deptno, job, 

sum(sal) 

from

scott.emp 

group

byrollup

(deptno, job);  

客戶的需求就好像腎虛的人尿頻一樣(誰說客戶是上帝,上帝哪來那麼多的需求?),再統計每個工作型別的工資總額吧。****,我再加乙個union all再搞定,修改後的sql語句如下:

[sql]view plain

copy

select

deptno, job, 

sum(sal)  

from

scott.emp  

group

bydeptno, job  

union

allselect

deptno, 

null

job, 

sum(sal)  

from

scott.emp  

group

bydeptno  

union

allselect

null

deptno, job, 

sum(sal)  

from

scott.emp  

group

byjob  

union

allselect

null

deptno, 

null

job, 

sum(sal) 

from

scott.emp;  

老師再批註:老師在講你有沒有在聽,根本就沒有在聽嘛!再教你乙個簡潔的sql語句,請看:

[sql]view plain

copy

select

grouping

(job),deptno, job, 

sum(sal)  

from

scott.emp  

group

bycube

(deptno, job)  

order

bydeptno;  

客戶想了想說,只要統計部門工資總額和工作型別工資總額就可以了(我每天都徘徊在殺人和忍住不殺之間),我****ing減掉乙個union all搞定,修改後的sql語句如下:

[sql]view plain

copy

select

null

deptno, job, 

sum(sal)  

from

scott.emp  

group

byjob  

union

allselect

deptno, 

null

job, 

sum(sal) 

from

scott.emp 

group

bydeptno;  

老師再再批註:你小子算是徹底沒救了,但我是老師啊,決不放棄任何乙個學生。再再教你最後一招,仔細看下面:

[sql]view plain

copy

select

grouping

(deptno),

grouping

(job),grouping_id(job), deptno, job, 

sum(sal)  

from

scott.emp  

group

bygrouping

sets(deptno, job);  

忙活半天總算把客戶的需求都滿足了,稍微松了一口氣,不過既然學到新東西,我們有必要最後總結一下。

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,最後對全表進行group by操作。

group by grouping sets(a,b,c):依次對(c)、(b)、(a)進行group by。

Oracle高階查詢之GROUP BY

對於group by 的方式不再累贅,高階方式如下案例。為了方便大家學習和測試,所有的例子都是在oracle自帶使用者scott下建立的。所用emp表,如果沒有此表請參考文章 中拷貝 現在客戶的需求是統計部門中每種工作的工資總額,最後還需要統計所有人的工資總數,相信這樣的需求對大家來說還是比較簡單的...

Oracle高階查詢之CONNECT BY

為了方便大家學習和測試,所有的例子都是在oracle自帶使用者scott下建立的。oracle中的select語句可以用start with connect by prior 子句實現遞迴查詢,connect by 是結構化查詢中用到的,其基本語法是 select from where 過濾條件,用...

oracle高階查詢之相關子查詢

在子查詢中一般先執行子查詢,在執行住查詢,但是相關子查詢列外 相關子查詢就是把主查詢的值作為引數傳遞給子查詢 例子 找到員工表中薪水大於平均薪水員工 方法一 select empno,ename,sal,select g sal from emp where deptno e.deptno gsal...