PIVOT没有聚合。在多列上使用Max

时间:2016-12-23 18:29:06

标签: sql-server

我有一个包含以下列的表:

      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

1 个答案:

答案 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

如果它有助于可视化,则带有交叉应用的子查询会生成此

enter image description here