计算两列,并将该行的结果用作下一行的值

时间:2019-07-13 05:35:59

标签: sql oracle

我试图在这里实现结果集,但是我无法继续。下面是数据集,请帮帮我。

EMP_ID  QTR   VAL   VAL_TO_MINUS  RESULT_COL
12345   Q1    4000                 4000
12345   Q2                         4000
12345   Q3            50           3950
12345   Q4            100          3850
12345   Q1            50           3800
12345   Q2                         3800
12345   Q3                         3800

最早的解决方案将非常有帮助。我必须在几天后将代码推送到产品中。

2 个答案:

答案 0 :(得分:0)

似乎您正在寻找示例数据表(result_col)的最右列

要确定这一点,我们需要一个partition byorder by这样的解析函数标准,用于诸如partition by emp_idorder by qtr的分析函数。在这种情况下,我们只能进行到第一个Q4。但是考虑到您最后的评论,其中Qtr值为0,1,2 ... 11,那么您可以使用以下查询:

with t( EMP_ID, QTR, VAL, VAL_TO_MINUS ) as 
(
 select 12345,0,4000,null from dual union all
 select 12345,1,null,null from dual union all
 select 12345,2,null,  50 from dual union all
 select 12345,3,null, 100 from dual union all
 select 12345,4,null,  50 from dual union all
 select 12345,5,null,null from dual union all
 select 12345,6,null,null from dual union all
 select 12345,7,null,null from dual 
)
select t.*,
       sum(val) over (order by qtr)
       -sum(nvl(val_to_minus,0)) over (order by qtr) as result_col
  from t

EMP_ID  QTR VAL    VAL_TO_MINUS RESULT_COL
12345   0   4000                4000
12345   1                       4000
12345   2          50           3950
12345   3          100          3850
12345   4          50           3800
12345   5                       3800
12345   6                       3800
12345   7                       3800

Demo

答案 1 :(得分:0)

您无法对显示的数据进行所需的操作。您的结果取决于行的顺序。但是,SQL表表示无序集。排序由列明确提供。您的quarter列中有重复项,因此没有提供必要的顺序。

如果您确实有一列,那么累积总和将满足您的要求。也许最简单的是:

select t.*,
       sum(coalesce(val, 0) - coalesce(val_to_minus, 0)
          ) over (partition by emp_id order by ?) as result_col
from t;

?用于表示顺序的列。