纸飞机

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  22 随笔 :: 28 文章 :: 30 评论 :: 0 Trackbacks

问题:对于数字列中的值,计算其累计差。例如,计算DEPTNO 10中工资的累计差。要返回下列结果集:

ENAME              SAL RUNNING_DIFF

---------- ---------- ------------

MILLER            1300          1300

CLARK             2450         -1150

KING              5000         -6150

解决方案

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<>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

讨论

该解决方案与“生成累计和”一节介绍的解决方案大致相同。唯一的差别是:SAL除了第一个值(因为要从DEPTNO 10的SAL开始)之外,其余所有值都返回负值。

posted on 2008-05-14 21:42 纸飞机 阅读(543) 评论(0)  编辑  收藏 所属分类: Database

只有注册用户登录后才能发表评论。


网站导航: