我试图在这里实现结果集,但是我无法继续。下面是数据集,请帮帮我。
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
最早的解决方案将非常有帮助。我必须在几天后将代码推送到产品中。
答案 0 :(得分:0)
似乎您正在寻找示例数据表(result_col
)的最右列
要确定这一点,我们需要一个partition by
和order by
这样的解析函数标准,用于诸如partition by emp_id
和order 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
答案 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;
?
用于表示顺序的列。