我有下表:
--------------------------------------------------------------
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将始终获得最新值减去最旧值。
有没有人对此有所了解?
谢谢。
答案 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。