【问题标题】:T-SQL previous year total in next year column明年列中的 T-SQL 上一年总计
【发布时间】:2014-10-01 10:34:31
【问题描述】:

我目前有一个如下所示的表格:

fscYear ID          Days    #Invoices     AVG
2011    20000807    221     7             27
2012    20000807    403     15            25
2013    20000807    390     14            26
2014    20000807    119     4             23

我想在下一年包括上一年的 AVG,如下所示:

fscYear ID          Days    #Invoices   AVG  prevAVG
2011    20000807    221     7           27    0
2012    20000807    403     15          25    27
2013    20000807    390     14          26    25
2014    20000807    119     4           23    26

我怎样才能做到这一点?

编辑 SQL 很简单,

select * from theTableThatHoldsThedata

【问题讨论】:

  • 您使用的是什么版本的 SQL Server?
  • SQL 2008 R2 和 SQL 2012

标签: sql sql-server-2008-r2 sql-server-2012


【解决方案1】:

大多数数据库都支持 ANSI 标准窗口函数。你可以通过lag() 做到这一点:

select t.*, coalesce(lag(avg) over (order by by fscyear), 0) as prevAVG
from atable t;

这适用于 SQL Server 2012+。对于早期版本,您可以使用相关子查询或apply

select t.*, coalesce(tprev.prevAvg, 0) as prevAvg
from atable t outer apply
     (select top 1 t2.Avg as prevAvg
      from atable t2
      where t2.fscyear < t.fscyear
      order by t2.fscyear desc
     ) tprev;

【讨论】:

  • 第一个解决方案给了我这个错误:未启用并行数据仓库 (PDW) 功能。我认为我无法在实时系统上启用它。现在测试第二个解决方案
  • 第二个解决方案抛弃了 2011 年的记录,并在所有其他年份重复数字 27
  • @user3036342 。 . .我省略了order by
  • 您的第二个建议/编辑有效,但它仍然丢弃了 2011 年的第一个记录。
  • @user3036342 将cross apply 更改为Outer Apply 作为第一条记录或最小年份不满足where条件。
【解决方案2】:

你可以写成:

SELECT Cur.fscYear ,Cur.ID,Cur.Days,Cur.#Invoices,Cur.AVG,  
       isnull(Prv.AVG,0) AS prevAVG
FROM test  AS Cur
LEFT OUTER JOIN test AS Prv
ON Cur.fscYear = Prv.fscYear + 1;

Demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-04
    • 1970-01-01
    • 2010-09-08
    • 2021-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多