Oracle分組函數以及數據分組

簡單總結一下對於數據的分組和分組函數。

本文所舉實例,數據來源oracle用戶scott下的emp,dept ,salgrade 3表:數據以下:

 

 

 1、分組函數

 一、sum()求和函數、max()求最大值函數、min()求最小值函數、avg()求平均值函數、count()求總行數函數   

Expression:   sum(column)、max(cloumn)、min(cloumn)、avg(column)、count(column)   其中column都是字段名稱

Example:

select avg(sal),max(sal),min(sal),sum(sal),count(sal) from emp;

 

 二、distinct關鍵字:英譯有區別的,用於對同一個列去除重複值: Expression:      dinsticnt(column)

Example:

select distinct deptno from emp;

三、wm_concat函數:行轉列函數,將列值以逗號做爲分割顯示在一行的函數。    Expression(column)

Example:

select wm_concat(ename) from emp;

2、數據分組

一、group by分組子句:和分組函數結合使用,對其餘條件進行分組,如求每一個部門的平均工資,平均工資用分組函數avg,每一個部門則需用group by 分組

Example:

select deptno,avg(sal) from emp group by deptno;

注意:group by字句中的條件必須是全部的除了分組之外的全部列纔不會出錯,而且必須和分組函數結合使用不然沒有分組的意義,而且會報錯。

二、having 子句:若是查詢條件中有分組函數,此時不能使用where子句,替換爲having子句,用於對分組後的結果進行過濾。oracle

Example:函數

 

能夠看出where子句不容許使用分組函數spa

select deptno,avg(sal) from emp group by deptno having avg(sal)>2000;

 3、經典實例分析:

一、求部門平均薪水的等級和求部門平均的薪水等級。

這裏多用到一個薪水等級的表salgrade:

select deptno,avg_sal,grade from (select deptno,avg(sal) avg_sal from emp group by deptno) a join salgrade on
(a.avg_sal between losal and hisal);

解析:第一問:由問題可知須要求三個值,deptno,avg_sa,grade,求解的是平均薪水的等級,那麼先求部門的平均薪水,用分組函數和group_by子句,分組條件很明顯deptno,將此結果看作一個新表a,其中能夠查詢到deptno和avg_sal,接下來還有一個等級須要求解,直接join表salgrade,條件也很明顯,平均工資在低工資和高工資之間就能夠了,加入條件後便可查詢出對應的grade等級

select deptno,avg(grade) from (select deptno,grade from emp e join salgrade on e.sal between losal and hisal) group by deptno; 

第二問:由題意分析出須要求解2個值deptno,avg(grade),平均 的薪水等級重心是等級,劃分爲小問題先求解每一個員工薪水等級,從emp表聯合salgrade表查詢,條件是每一個員工工資在losal和hisal之間,這樣就求出了部門號和每一個員工的工資等級,那麼再求平均等級只須要avg函數,又題目求得是每一個部門的工資等級,只須要分組便可,分組條件deptno。

注:此類題型注重對問題的解讀,分析出求解幾個值,再使用傳統思路將大問題劃分爲若干小問題,由小及大解決便可。

 

                                                              2018-08-10  09:27:273d

相關文章
相關標籤/搜索