【问题标题】:In oracle How to subtract previous value in a column with calculation of other column在oracle中如何通过计算其他列来减去列中的先前值
【发布时间】:2017-07-23 16:51:46
【问题描述】:

我需要如下所示的表格。如您所见,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 server 中实现此结果。 请原谅我糟糕的英语和菜鸟格式。

【问题讨论】:

  • 请将数据发布为格式化文本,not screenshots
  • 你需要非常清楚的解释什么是INPUTS,什么是期望的OUTPUT。如果我理解正确,您会得到几行三列。给出的是每一行的年份,每一行的tot_dflt_mgt 值,最后一行的tot_accum_mgt,您必须根据这些输入计算每一行的tot_accum_mgt。那是对的吗?请确认。
  • 是的,第三列将具有计算值。在第 3 列 tot_accum_mgt 中,仅给出了 2016 年的所有值。
  • 您好,非常感谢您的帮助。您能否建议使用 SQL Server 2005 解决此问题

标签: sql sql-server oracle


【解决方案1】:

也许将每一行加入到上一年?

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)

【讨论】:

  • 这行不通,因为大多数值y1.to_accum_mgt 在您开始时将是null,所以减法的结果也将是null。您可能正在考虑连续计算答案,但这不是 SQL 的工作原理。
  • @mathguy,不,我理解 OP 的意思是图像是输入表,也许我误解了。您创建的表在第三列中有 NULL,但他没有。但也许 OP 意味着这就是他正在寻找的输出。
  • 你误会了。请参阅原始帖子下方的交流,我在那里询问了 OP,他确认了。我发现在尝试解决问题之前最好先完成这个过程。在这种情况下我也做了同样的事情。
【解决方案2】:

出于测试目的,我创建了一个类似于您的小表。然后底部的查询显示了如何使用解析函数来解决这类问题。不需要逐行处理。

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

【讨论】:

  • 非常感谢。这就是我要找的。​​span>
  • 您好,非常感谢您的帮助。您能否建议使用 SQL Server 2005 解决此问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-28
  • 2021-05-01
  • 2018-10-07
相关资源
最近更新 更多