2016-12-23 7 views
3
は、私は次の列を持つテーブルがある複数の列に最大の

使用:私はマックス(列)にピボットを使用しようとしたが、実現凝集体のないPIVOT。

 Category  2014 2015 2016 
     Cost   100  150 200 
     Price  200  300 500 

 Year Cost Price 
     2014 100 200 
     2015 150 300 
     2016 200 500 

私はにデータを転置する必要があります私は1つの列に対してのみ行うことができます。私は最大(コスト)、最大(価格)を使用することはできません。

どのように私はSQLでこれを達成することができますか?

SELECT * 
FROM (
     SELECT Year,cost,price 
     FROM #t1) up 
     PIVOT (Max(cost) FOR year IN ([2014],[2015],[2016])) AS pvt 

予想される出力は次のようになります。

Category  2014 2015 2016 
     Cost   100  150 200 
     Price  200  300 500 
+0

あなたの質問を投稿することで、あなたの質問を調べることができます。 – ajeh

+0

@ajehさんにお返事ありがとうございます - 今すぐ質問を掲載しました。 – Bee

答えて

1

あなたがダイナミックたいAsuming。トリックはそれが可視化、クロスとサブクエリに役立つ場合

Select [Category],[2014],[2015],[2016] 
From (
     Select A.Year 
       ,B.* 
     From YourTable A 
     Cross Apply (Values ('Cost',A.Cost) 
          ,('Price',A.Price)) B (Category,Value) 
    ) A 
Pivot (max(Value) For [Year] in ([2014],[2015],[2016])) p 

を生成する動的SQLない場合

Declare @SQL varchar(max) = Stuff((Select Distinct ',' + QuoteName([Year]) From Yourtable Order by 1 For XML Path('')),1,1,'') 
Select @SQL = ' 
Select [Category],' + @SQL + ' 
From (
     Select A.Year 
       ,B.* 
     From YourTable A 
     Cross Apply (Values (''Cost'',A.Cost) 
          ,(''Price'',A.Price) 
        ) B (Category,Value) 
    ) A 
Pivot (max(Value) For [Year] in (' + @SQL + ')) p' 
Exec(@SQL); 

戻り

Category 2014 2015 2016 
Cost  100  150  200 
Price  200  300  500 

を適用クロスを使用することです適用するとこれが生成されます

enter image description here

+0

これは完璧です。ありがとうジョンカペレッティ。交差適用とピボットは魅力のように機能します。再度、感謝します。 – Bee

+0

@ user6754080お手伝いします –

+0

@ user6754080あなたがネットを計算したい場合は、あなたのCROSS APPLY ,,,( '' Net ''、A.Price-A.Cost)と最後の行としてORDER BYを追加します。IIF([Category] ​​= '' Net ''、1,0)、[Category] ​​Desc –

関連する問題