簡單總結一下對於數據的分組和分組函數。 本文所舉實例,數據來源oracle用戶scott下的emp,dept ,salgrade 3表:數據如下: 一、分組函數 1、sum()求和函數、max()求最大值函數、min()求最小值函數、avg()求平均值函數、count()求總行數函數 Express ...
簡單總結一下對於數據的分組和分組函數。
本文所舉實例,數據來源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;
2、distinct關鍵字:英譯有區別的,用於對同一個列去除重覆值: Expression: dinsticnt(column)
Example:
select distinct deptno from emp;
3、wm_concat函數:行轉列函數,將列值以逗號作為分割顯示在一行的函數。 Expression(column)
Example:
select wm_concat(ename) from emp;
二、數據分組
1、group by分組子句:和分組函數結合使用,對其他條件進行分組,如求每個部門的平均工資,平均工資用分組函數avg,每個部門則需用group by 分組
Example:
select deptno,avg(sal) from emp group by deptno;
註意:group by字句中的條件必須是所有的除了分組以外的所有列才不會出錯,並且必須和分組函數結合使用否則沒有分組的意義,並且會報錯。
2、having 子句:如果查詢條件中有分組函數,此時不能使用where子句,替換為having子句,用於對分組後的結果進行過濾。
Example:
可以看出where子句不允許使用分組函數
select deptno,avg(sal) from emp group by deptno having avg(sal)>2000;
三、經典實例分析:
1、求部門平均薪水的等級和求部門平均的薪水等級。
這裡多用到一個薪水等級的表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:27