我有一个包含以下列的表:
Year Cost Price
2014 100 200
2015 150 300
2016 200 500
我需要将数据转置为:
Category 2014 2015 2016
Cost 100 150 200
Price 200 300 500
我尝试在Max(列)上使用Pivot,但意识到我只能在一列中使用它。我不能使用Max(成本),Max(价格)。
知道如何在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 :(得分:1)
假设你想要动态。诀窍是使用Cross Apply
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
如果不是DYNAMIC SQL Generated
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
如果它有助于可视化,则带有交叉应用的子查询会生成此