获取最近2年的价值和最早的年份SQL

时间:2016-10-21 06:51:35

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

我有下表:

--------------------------------------------------------------
InspectYear     Part       Pos1    Pos2    Pos3    Pos4
--------------------------------------------------------------
2009            001        8       8       9       7
2009            002        9       7       8       6
2011            001        9       9       8       7
2011            002        7       8       6       8
2013            001        8       9       7       9
2013            002        7       7       8       8
2015            001        8       8       7       4
2015            002        7       6       9       8

InspectYear数据将始终每两年添加一次 我想计算每个pos#列与上一年(Calc1)的最新值。也是具有最旧值(Calc2)的最新值。我希望得到以下结果:

---------------------------------------------------------------------
Part      Pos      2009    2011    2013    2015    Calc1     Calc2
---------------------------------------------------------------------
001       Pos1     8       9       8       8       0         0
001       Pos2     8       9       9       8       -1        0
001       Pos3     9       8       7       7       0         -2
001       Pos4     7       7       9       4       -5        -3

对于枢轴问题,我做了以下代码,但不知道计算:

declare @inspectyear as nvarchar(max), @query as nvarchar(max);

set @inspectyear = STUFF((select distinct ',' + quotename(InspectYear) from #t2 c
                  for XML path(''), type).value('.','NVARCHAR(MAX)'),1,1,'')

set @query =
';with data as
(
      select      inspectyear,
                  partno, Pos, number
      from #t2
      unpivot
      (
            number
            for Pos in ([Pos1], [Pos2], [Pos3], [Pos4])
      ) unpvt
)
select * into ##temp
from data
pivot
(
      sum(number)
      for inspectyear in (' + @inspectyear + ')
) pvt
order by Part'

exec sp_executesql @query = @query;
select * from ##temp;
drop table ##temp;

从上表中,Calc1是2015年的价值减去2013年的价值。
Calc2是2015年的价值减去2009年的价值。

上面的公式将在2017年创建新记录时发生变化。因此Calc1的公式总是得到年份的最后2个值。 Calc2将始终获得最新值减去最旧值。

有没有人对此有所了解?
谢谢。

1 个答案:

答案 0 :(得分:1)

您希望在插入## temp时添加这两个计算列,但您需要在构建动态查询的同时指定它们的内容。因此,您使用与获取列名称相同的方法 - 构建字符串。

在您的工作顶部,添加另一个字符串变量@calc

declare @inspectyear as nvarchar(max), @calc as nvarchar(max), @query as nvarchar(max);

set @inspectyear = STUFF((select distinct ',' + quotename(InspectYear) from ##t2 c
                  for XML path(''), type).value('.','NVARCHAR(MAX)'),1,1,'')

select @calc = ', ' + quotename(Max(InspectYear)) + '  - ' + quotename(Max(InspectYear)-2) 
         + ' as Calc1, ' + quotename(Max(InspectYear)) + ' - ' + quotename(min(InspectYear)) 
         + ' as Calc2' from #t2;

然后在动态查询字符串中包含该内容,如下所示:

set @query =
';with data as
(
      select      inspectyear,
                  partno, Pos, number
      from #t2
      unpivot
      (
            number
            for Pos in ([Pos1], [Pos2], [Pos3], [Pos4])
      ) unpvt
)
select * ' + @calc + ' into ##temp
from data
pivot
(
      sum(number)
      for inspectyear in (' + @inspectyear + ')
) pvt
order by partno';

exec(@query);

这应该根据需要将额外的列添加到## temp。