SQL 计算累计差,计算某个数值列的累计差。例如,希望计算 DEPTNO
等于 10 的部门里员工工资的累计差,并且得到如下所示的结果集。
SQL 计算累计差 问题描述
计算某个数值列的累计差。例如,希望计算 DEPTNO
等于 10 的部门里员工工资的累计差,并且得到如下所示的结果集。
ENAME SAL RUNNING_DIFF
---------- ---------- ------------
MILLER 1300 1300
CLARK 2450 -1150
KING 5000 -6150
SQL 计算累计差 解决方案
DB2 和 Oracle
使用窗口函数 SUM OVER
计算累计差。
1 select ename,sal,
2 sum(case when rn = 1 then sal else -sal end)
3 over(order by sal,empno) as running_diff
4 from (
5 select empno,ename,sal,
6 row_number() over(order by sal,empno) as rn
7 from emp
8 where deptno = 10
9 ) x
MySQL、PostgreSQL 和 SQL Server
使用标量子查询计算累计差。
1 select a.empno, a.ename, a.sal,
2 (select case when a.empno = min(b.empno) then sum(b.sal)
3 else sum(-b.sal)
4 end
5 from emp b
6 where b.empno <= a.empno
7 and b.deptno = a.deptno ) as rnk
8 from emp a
9 where a.deptno = 10
SQL 计算累计差 扩展知识
本实例的解决方案和 7.6 节的类似。唯一的不同之处在于 SAL
的结果都是负数,当然第一行除外(本例把 DEPTNO
等于 10 的第一个 SAL
值作为起点)。