Oracle高階查詢之GROUP BY

2021-06-28 21:16:24 字數 2901 閱讀 4153

對於group by 的方式不再累贅,高階方式如下案例。

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

如果沒有此表請參考文章:中拷貝

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

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

----統計部門中每種工作的工資總額 , 還需要統計每個部門的工資數和統計所有人的工資總數

select * from (select deptno, job, sum(sal) from emp group by deptno, job order by deptno)

union all

select * from (select deptno, null job, sum(sal) from emp group by deptno order by deptno)

union all

select null deptno, null job, sum(sal) from emp;

其實還有一種簡單的方式可以實現,如下函式 group by rollup(...)

select deptno, job, sum(sal) 工資 from emp group by rollup(deptno, job);

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

----統計部門中每種工作的工資總額 , 還需要統計所有人的工資總數和統計每個部門的工資數,再統計每個工作型別的工資總額

select * from (select deptno, job, sum(sal) from emp group by deptno, job order by deptno)

union all

select * from (select deptno, null job, sum(sal) from emp group by deptno order by deptno)

union all

select null deptno, job, sum(sal) from emp group by job

union all

select null deptno, null job, sum(sal) from emp;

上面的方法還可以使用簡單函式方法實現,修改sql如下

select grouping(job),deptno, job, sum(sal) from emp group by cube(deptno, job) order by deptno;  

select deptno, job, sum(sal) from emp group by cube(deptno, job) order by deptno; -- 簡化上面**

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

-- 統計工作型別工資總額和部門工資總額

select null deptno, job, sum(sal) from emp group by job

union all

select deptno, null job, sum(sal) from emp group by deptno;

莫慌,這裡還有乙個大招,修改**如下

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

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

為了方便大家學習和測試,所有的例子都是在oracle自帶使用者scott下建立的。現在客戶的需求是統計部門中每種工作的工資總額,最後還需要統計所有人的工資總數,相信這樣的需求對大家來說還是比較簡單的,很快就能寫出sql語句,如下 sql view plain copy select deptno,j...

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...