SQL中的Null值處理

在作報表時,有時須要計算「佔比」這個指標。mysql

舉個例子,統計每一個員工的薪資佔部門薪資總和的比重。sql

在 SQL 中,計算佔比有不少種寫法,本文將列出常見的幾種寫法。微信

就用前面舉的例子作演示,恰好,emp 表的數據就能符合咱們的要求。函數

先來看看 emp 表的數據 >>>.net

empno  ename   sal      deptno  
------  ------  -------  --------
  7782  CLARK   2450.00        10
  7839  KING    5000.00        10
  7934  MILLER  1300.00        10
  7369  SMITH   800.00         20
  7566  JONES   2975.00        20
  7788  SCOTT   3000.00        20
  7876  ADAMS   1100.00        20
  7902  FORD    3000.00        20
  7499  ALLEN   1600.00        30
  7521  WARD    1250.00        30
  7654  MARTIN  1250.00        30
  7698  BLAKE   2850.00        30
  7844  TURNER  1500.00        30
  7900  JAMES   950.00         30

毋庸置疑,無論使用哪一種方法,要計算佔比,都要先計算出部門的合計薪資。code

統計各個部門的合計薪資,SQL 能夠就這麼寫:get

SELECT 
  deptno,
  SUM(sal) AS sal_dept 
FROM
  emp 
GROUP BY deptno

在 emp 表的基礎上,再去關聯部門合計薪資的結果集,就能算出每一個員工的薪資佔部門薪資合計的比重。io

SELECT 
  empno,
  ename,
  sal,
  sal / sal_dept AS ratio,
  a.deptno 
FROM
  emp a 
  INNER JOIN 
    (SELECT 
      deptno,
      SUM(sal) AS sal_dept 
    FROM
      emp 
    GROUP BY deptno) b 
    ON b.deptno = a.deptno ;

計算結果展現 >>>class

empno  ename   sal      ratio     deptno  
------  ------  -------  --------  --------
  7782  CLARK   2450.00  0.280000        10
  7839  KING    5000.00  0.571429        10
  7934  MILLER  1300.00  0.148571        10
  7369  SMITH   800.00   0.073563        20
  7566  JONES   2975.00  0.273563        20
  7788  SCOTT   3000.00  0.275862        20
  7876  ADAMS   1100.00  0.101149        20
  7902  FORD    3000.00  0.275862        20
  7499  ALLEN   1600.00  0.170213        30
  7521  WARD    1250.00  0.132979        30
  7654  MARTIN  1250.00  0.132979        30
  7698  BLAKE   2850.00  0.303191        30
  7844  TURNER  1500.00  0.159574        30
  7900  JAMES   950.00   0.101064        30

有的朋友以爲單獨統計每一個部門的合計薪資再關聯原表的寫法太麻煩了,那也能夠選擇標量子查詢的寫法。基礎

SELECT 
  empno,
  ename,
  sal,
  sal / 
  (SELECT 
    SUM(sal) 
  FROM
    emp 
  WHERE deptno = a.deptno) AS ratio,
  deptno 
FROM
  emp a

不關聯是否也能實現呢?試試窗口函數。

SELECT 
  empno,
  ename,
  sal,
  sal / SUM(sal) over (PARTITION BY deptno) AS ratio,
  deptno 
FROM
  emp ;

本文分享自微信公衆號 - SQL實現(gh_684ee9235a26)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索