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

Posted

技术标签:

【中文标题】PIVOT 没有聚合。在多列上使用 Max【英文标题】:PIVOT without aggregate. Using Max on multiple columns 【发布时间】:2016-12-23 18:29:06 【问题描述】:

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

      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(column) 上使用 Pivot,但意识到我只能对一列执行此操作。我不能使用 Max(cost)、Max(price)。

知道如何在 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

【问题讨论】:

发布您的查询将使我们能够调查您的问题。 感谢回复@ajeh - 现在发布我的查询。 【参考方案1】:

假设您想要动态。诀窍是使用交叉应用

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

如果不是动态生成的 SQL

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

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

【讨论】:

这是完美的。谢谢约翰·卡佩莱蒂。交叉应用和旋转就像一个魅力。再次感谢。 @user6754080 乐于助人 @user6754080 您知道,只是为了好玩,如果您想计算 NET,请将以下内容插入您的 CROSS APPLY ,, ,(''Net'',A.Price-A.Cost)然后添加一个 ORDER BY 作为最后一行 Order By IIF([Category]=''Net'',1,0),[Category] ​​Desc

以上是关于PIVOT 没有聚合。在多列上使用 Max的主要内容,如果未能解决你的问题,请参考以下文章

PIVOT 没有聚合转换 2X2 表

在没有聚合的 SQL 中将行透视到列

SQL Pivot 多列 [关闭]

在 SQL Pivot 上使用 Min 聚合

同一列上具有多个聚合的 T-SQL Pivot

python中的自定义pivot_ui聚合器?