1. 程式人生 > >分組統計

分組統計

組函式:sum()、avg()、max()、min()、median()、stddev()、variance()、count()

單欄位(用一個變數分組)
統計出每個部門的人數
SELECT deptno,COUNT(*) FROM emp GROUP BY deptno ;

select 後面接的列和group by 後面接的列必須是一樣的
除非select 後面加組函式,可以不放在group by後面

多欄位(用多個變數分組)
查詢出每個部門的詳細資訊
SELECT d.deptno,d.dname,d.loc,
NVL(COUNT(e.empno),0) count,NVL(ROUND(AVG(sal),2),0) avg,
NVL(SUM(sal),0) sum,NVL(MAX(sal),0) max,NVL(MIN(sal),0) min
FROM emp e,dept d
WHERE e.deptno(+)=d.deptno
GROUP BY d.deptno,d.dname,d.loc ;

group by 後面接多個變數,進行更為細緻的分組統計
group by rollup(job) 進行合計
group by cube(job) 進行合計
分組之後的資料進行再次過濾需要用having語句

SQL語句執行流程:

  1. 執行FROM子句,確定要檢索的資料來源。
  2. 執行WHERE子句,使用限定符對資料行進行過濾。
  3. 執行GROUP BY子句,根據指定欄位進行分組。
  4. 執行HAVING子句,對分組後的統計資料進行過濾。
  5. 執行SELECT子句,確定要檢索出的分組欄位以及編寫相應統計函式。
  6. 執行ORDER BY子句。

顯示非銷售人員工作名稱以及從事同一工作僱員的月工資的總和,並且要滿足從事同一工作的僱員的月工資合計大於$5000,輸出結果按月工資的合計升序排列
SELECT job , SUM(sal) sum FROM emp WHERE job<>‘SALESMAN’ GROUP BY job
HAVING SUM(sal)>5000 ORDER BY sum ASC ;

select empno,count() from myemp group by empno having count()>1; 檢視重複資料

WHERE子句:在分組之前使用,表示從所有資料中篩選出部分資料
HAVING子句:在分組之後使用的,表示對分組統計後的資料執行再次過濾