在作报表时,有时须要计算“占比”这个指标。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源创计划”,欢迎正在阅读的你也加入,一块儿分享。