**seq** **amt1** **amt2** **int_amt** **final_amt**
1 500 NuLL 2000 2500
2 Null NULL NULL 2500
3 NULL NULL NULL 2500
4 200 NULL NULL 2700
通过对第一行应用final_amt = int_amt + amt1-amt2来更新final_amt 然后对于所有行,如果amt1和amt2的行为NULL,则final_amt = final_amt + amt1-amt2,则final_amt应包含last_amt的前一个值IN ORACLE;
答案 0 :(得分:0)
一种方法是相关子查询。考虑到第一行之后int_amt
为NULL
,这似乎可以满足您的需求:
update t
set final_amt = (select coalesce(sum(amt1), 0) - coalesce(sum(amt2), 0) + coalesce(sum(int_amt), 0)
from t t2
where t2.seq <= t.seq
);
如果您想在第一行后忽略int_amt
,请使用case
:
update t
set final_amt = (select (coalesce(sum(amt1), 0) - coalesce(sum(amt2), 0) +
(case when seq > 1 then 0 else coalesce(sum(int_amt), 0) end)
)
from t t2
where t2.seq <= t.seq
);