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的主要内容,如果未能解决你的问题,请参考以下文章