SQL 计算累计差

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

MySQLPostgreSQLSQL 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 值作为起点)。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

SQL 实例