在oracle中如何通过计算其他列

时间:2017-03-03 14:19:04

标签: sql sql-server oracle

我需要一个表格,如下所示。您可以看到mgt_yeartot_dflt_mgtto_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服务器中实现这个结果。 请原谅我糟糕的英语和菜鸟格式。

Table Image

2 个答案:

答案 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)