我需要一个表格,如下所示。您可以看到mgt_year
,tot_dflt_mgt
和to_accum_mgt
列。在年度栏中 2016 的值 39.772773 ,累计值为 1380.055 。我想要的是当我做(to_accum_mgt - tot_dflt_mgt)
时我希望计算结果在前一行中,如图所示。然后,这个计算结果,即 1340.282227 用于减去 65.7915 ,如(1340.282227 - 65.7915)一年 2015 等等所有过去的年份。
我在excel中做过这个,但是如何在Oracle和SQL服务器中实现这个结果。
请原谅我糟糕的英语和菜鸟格式。
答案 0 :(得分:1)
为了测试目的,我创建了一个类似于你的小桌子。然后底部的查询显示了如何使用分析函数解决这类问题。不需要逐行处理。
create table t ( mgt_year, tot_dflt_mgt, tot_accum_mgt ) as (
select 2013, 10, null from dual union all
select 2014, 15, null from dual union all
select 2015, 9, null from dual union all
select 2016, 20, 600 from dual
);
select * from t;
MGT_YEAR TOT_DFLT_MGT TOT_ACCUM_MGT
-------- ------------ ------------
2013 10
2014 15
2015 9
2016 20 600
select mgt_year, tot_dflt_mgt,
max(tot_accum_mgt) over () -
nvl( sum(tot_dflt_mgt) over
(order by mgt_year
rows between 1 following and unbounded following)
, 0 ) as tot_accum_mgt
from t;
MGT_YEAR TOT_DFLT_MGT TOT_ACCUM_MGT
-------- ------------ -------------
2016 10 556
2014 15 571
2015 9 580
2016 20 600
答案 1 :(得分:0)
或许将每一行加入上一年?
Select
y1.mgt_year
,y2.mgt_year
,(y1.to_accum_mgt - y2.tot_accum_mgt) as myresult
from mytable y1
inner join mytable y2
on y1.mgt_year = (y2.mgt_year -1)