【问题标题】:Calculate difference between 1 and 5 year intervals in a value column计算值列中 1 年和 5 年间隔之间的差异
【发布时间】:2015-04-25 07:51:24
【问题描述】:

我有一个只包含几千条记录的简单表,其中性能不是主要考虑因素。

我想计算15 年份间隔内同一列中的值之间的差异。

例如,假设我有一个这样的表:

Name, Year, Value<br>

Joe       2014       25<br>
Joe       2013       22<br>
Joe       2012       26<br>
Joe       2011       18<br>
Joe       2010       21<br>
Mark      2014       33<br>
Mark      2013       31<br>
Mark      2012       34<br>
Mark      2011       28<br>
Mark      2010       18<br>

它可以追溯到几年前。

我想在给定名称的运行差异上为 1 year change5 year change 添加两列。

所以完成的输出应该是这样的(如果可能的话):

Name, Year, Value, 1-yr-change, 5-yr-change<br>
Joe       2014       25           3               4<br>
Joe       2013       22           -4              <whatever 2013-2009 is><br>
Joe       2012       26           8           <br>    
Joe       2011       18           -3<br>
Joe       2010       21           <whatever 2010-2009 is><br>
Mark      2014       33           2               15<br>
Mark      2013       31           -3              <whatever 2013-2009 is><br>
Mark      2012       34           6<br>
Mark      2011       28           10<br>
Mark      2010       18           <whatever 2010-2009 is><br>

这是我尝试使用表中的实际列的内容:

select t1.Agency, t1.FY, t1.[Tax Appropriations],<br>
case when t2.FY = T1.FY - 1 then T1.[Tax Appropriations] - T2.[Tax Appropriations] else null end as '1-yr-change',<br>
case when t2.FY = T1.FY - 5 then T1.[Tax Appropriations] - T2.[Tax Appropriations] else null end as '5-yr-change'<br>
from dbo.SHEFMain as t1<br>
left JOIN dbo.SHEFMain as t2 on T1.Agency = T2.Agency and T2.FY < T1.FY<br>
order by agency, fy desc<br>

产生的计算有效,但还有很多额外的重复行带有空值 - 所以我显然误解了连接过程或类似的东西。

【问题讨论】:

  • 我看到您已经回答了自己的问题,但仅供参考,您可能可以通过将 T2.FY &lt; T1.FY 更改为 T2.FY in (T1.FY-1, T1.FY-5) 并在您的列上使用 GROUP BY agency 和一些适当的聚合来挽救您的原始查询。你离得不远!
  • 感谢 WorkSmarter 的编辑和 shawnt00 的效率建议 - 抱歉,在发布之前我没有阅读如何正确格式化我的第一篇文章!

标签: tsql sql-server-2008-r2


【解决方案1】:

我在另一个论坛上得到了答案 - 感谢您的帮助!这是我得到的,它似乎工作得很好。如果您有任何问题或疑虑,请告诉我:

select t1.Agency
     , t1.FY
     , t1.[Tax Appropriations]
     , t1.[Tax Appropriations] - (SELECT T2.[Tax Appropriations] 
                             FROM dbo.SHEFMain as t2 
                             WHERE T2.Agency = T1.Agency 
                             AND T2.FY = T1.FY-1) as '1-yr-change'
     , t1.[Tax Appropriations] - (SELECT T3.[Tax Appropriations] 
                             FROM dbo.SHEFMain as t3 
                             WHERE t3.Agency = T1.Agency 
                             AND T3.FY = T1.FY-5) as '5-yr-change'
from dbo.SHEFMain as t1
order by T1.agency, 
         T1.fy DESC

【讨论】:

    猜你喜欢
    • 2020-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-12
    • 2014-07-22
    • 2016-08-12
    • 2016-01-01
    相关资源
    最近更新 更多