在作報表時,有時須要計算「佔比」這個指標。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源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。