2016-10-21 12 views
2

を取得し、私は次のテーブルを持っている:
最後の2年間の値と最も古い年のSQL

-------------------------------------------------------------- 
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データは常に、各パートごとに2年追加されます。
前年(Calc1)の各pos#列の最新の値を計算したいとします。また、最も古い値(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があります2013年
Calc2 2015マイナス値の値は、式は、上記の新しいレコードcを変更します2009年

2015マイナス値の値であり、 2017年にreated。したがって、Calc1の式は常に年の最後の2つの値を取得します。 Calc2は、常に最新の値から最も古い値を引いた値を取得します。

これについて誰かが考えていますか?
ありがとうございます。

+1

Plはhttp://stackoverflow.com/questions/10428993/understanding-pivot-function-in-t-sql – yuvi

+0

@yuviで確認します。リンクありがとうございます。しかしピボットのものについては、私はそれを得た。私が尋ねることは、2つの最新の年と最も古い値から値を取得する方法です。だから私は、テーブルがピボット回転する前に計算をすることができます。ピボットは動的であるためです。 – Haminteu

+0

@BeanFrog、私はピボットのことをしました、そして、私は動的なピボットの計算をする方法を混同します。そういうわけで、おそらくテーブルを回転させる前に計算をしなければならないのです。 – Haminteu

答えて

1

## tempに挿入するときにこれら2つの計算カラムを追加したいが、動的クエリを作成するときに同時に何を指定する必要がある。したがって、列名を取得するのと同じ方法を使用します。文字列を作成します。あなたの働きの上部に

、別の文字列変数、@calcに追加します。

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); 

を。これは、余分な列を追加する必要があります

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; 

が続いて次のように動的なクエリ文字列にすることを含めます必要に応じて## tempに変更します。

+0

キーワード 'to'の近くに構文が正しくありません。私はそれを間違って入力しましたか?または? – Haminteu

+0

Hmmm、私は正常に動作したクエリページからコピーして貼り付けたので、なぜあなたにとってうまくいかないのか分かりません。最後のexecをprintに変更すると、失敗したクエリが表示されます。結果を貼り付けると、どこに問題があるかがわかります。 – BeanFrog

+0

'+ @calc +'を選択して削除しても動作します。計算を追加すると動作しません – Haminteu

関連する問題