【发布时间】:2015-04-25 07:51:24
【问题描述】:
我有一个只包含几千条记录的简单表,其中性能不是主要考虑因素。
我想计算1 和5 年份间隔内同一列中的值之间的差异。
例如,假设我有一个这样的表:
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 change 和 5 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 < T1.FY更改为T2.FY in (T1.FY-1, T1.FY-5)并在您的列上使用GROUP BY agency和一些适当的聚合来挽救您的原始查询。你离得不远! -
感谢 WorkSmarter 的编辑和 shawnt00 的效率建议 - 抱歉,在发布之前我没有阅读如何正确格式化我的第一篇文章!