首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >oracle在查询中使用上述单元格计算值。

oracle在查询中使用上述单元格计算值。
EN

Stack Overflow用户
提问于 2014-02-24 10:47:21
回答 2查看 299关注 0票数 0

我正在尝试在这样的专栏上应用运行公式,我尝试了很多,我仍然不能做this.Plz,有人给出了使用oracle来实现这个操作的想法,

代码语言:javascript
运行
复制
EMP NO  SAL DEDUCTION BALANCE
1       10  5          10-5=5
1       10  2          5-2=3
1       15  2          3-2=1
1       21  1          1-1=0

我使用了滞后函数,但它返回上述单元格的相同值。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-24 11:57:57

您需要一个排序字段才能正确地得到差异。

我引入了一个增量字段来模拟一些排序。我认为不同的雇员没有不同的扣减。否则,您可以通过EMP_NO进行分区。

如果我正确理解了您的需要,请尝试如下:

代码语言:javascript
运行
复制
CREATE TABLE T
(SORT_KEY   NUMBER,
 EMP_NO     NUMBER,
 SAL        NUMBER,
 DEDUCTION  NUMBER);

INSERT INTO T VALUES(1, 1, 10, 5);
INSERT INTO T VALUES(2, 1, 10, 2);
INSERT INTO T VALUES(3, 1, 15, 2);
INSERT INTO T VALUES(4, 1, 21, 1);

COMMIT;

SELECT SORT_KEY, SAL,
       ABS(V) AS DEDUCTION,
       SUM(V) OVER(ORDER BY SORT_KEY) AS BALANCE
FROM (SELECT SORT_KEY, SAL,
             CASE WHEN LAG(DEDUCTION, 1) OVER(ORDER BY SORT_KEY) IS NULL
                  THEN SAL - DEDUCTION
                  ELSE - DEDUCTION END AS V
      FROM t
      ORDER BY SORT_KEY)
ORDER BY SORT_KEY;

SORT_KEY   SAL   DEDUCTION  BALANCE
--------   --    ---------  -------
       1   10    5          5
       2   10    2          3
       3   15    2          1
       4   21    1          0

DROP TABLE T PURGE;

按EMP_NO进行分区(如果这是您想要的):

代码语言:javascript
运行
复制
INSERT INTO T VALUES(5, 2, 10, 5);
INSERT INTO T VALUES(6, 2, 10, 2);
INSERT INTO T VALUES(7, 2, 15, 2);
INSERT INTO T VALUES(8, 2, 21, 1);

COMMIT;

SELECT SORT_KEY, EMP_NO, SAL,
       ABS(V) AS DEDUCTION,
       SUM(V) OVER(PARTITION BY EMP_NO ORDER BY SORT_KEY) AS BALANCE
FROM (SELECT SORT_KEY, EMP_NO, SAL,
             CASE WHEN LAG(DEDUCTION, 1) OVER(PARTITION BY EMP_NO ORDER BY SORT_KEY) IS NULL
                  THEN SAL - DEDUCTION
                  ELSE - DEDUCTION END AS V
      FROM t
      ORDER BY SORT_KEY)
ORDER BY EMP_NO, SORT_KEY;
票数 0
EN

Stack Overflow用户

发布于 2014-02-24 11:52:02

虽然业务需求对我来说仍然是个谜,但有一种方法(我添加了一个rn列来引入行的排序):

代码语言:javascript
运行
复制
with employees as (
  select 1 as rn, 1 as emp_no,10 as sal,5 as deduction, '10-5=5' as balance from dual union all 
  select 2 as rn, 1 as emp_no,10 as sal,2 as deduction, '5-2=3' as balance from dual union all 
  select 3 as rn, 1 as emp_no,15 as sal,2 as deduction, '3-2=1' as balance from dual union all 
  select 4 as rn, 1 as emp_no,21 as sal,1 as deduction, '1-1=0' as balance from dual )
select v1.*, 
  v1.sal - v1.aggr_deduction as remaining_sal_current_sal,
  v1.first_sal - v1.aggr_deduction as remaining_sal_first_sal 
from (
select rn,
       emp_no, 
       sal, 
       deduction,
       balance,
       sum(deduction) over (partition by emp_no order by rn) as aggr_deduction,
       (select sal from employees e1 where rn = 1 ) as first_sal
from employees
) v1
order by rn

SQL Fiddle

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21985536

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档