我推荐使用条件聚合,如下所示:
SELECT ROW_NUMBER() OVER(ORDER BY Price_ID) [ID],
Price_ID,
MIN(CASE WHEN Price_Tier = 1 THEN Cost_ID END) [C1ID],
MIN(CASE WHEN Price_Tier = 1 THEN Cost END) [C1Cost],
MIN(CASE WHEN Price_Tier = 2 THEN Cost_ID END) [C2ID],
MIN(CASE WHEN Price_Tier = 2 THEN Cost END) [C2Cost],
MIN(CASE WHEN Price_Tier = 3 THEN Cost_ID END) [C3ID],
MIN(CASE WHEN Price_Tier = 3 THEN Cost END) [C3Cost]
FROM T
GROUP BY Price_ID
然而,这也可以使用SQL Server的PIVOT函数完成。但是,它需要使用UNION,因为PIVOT不允许在单个PIVOT中进行多个聚合。
SELECT ROW_NUMBER() OVER(ORDER BY Price_ID) [ID],
*
FROM ( SELECT Price_ID, 'C' + CONVERT(VARCHAR, Price_Tier) + 'Cost' [Price_Tier], MIN(Cost) [Value]
FROM T
GROUP BY Price_ID, Price_Tier
UNION ALL
SELECT Price_ID, 'C' + CONVERT(VARCHAR, Price_Tier) + 'ID' [Price_Tier], MIN(Cost_ID) [Value]
FROM T
GROUP BY Price_ID, Price_Tier
) data
PIVOT
( MAX(Value)
FOR Price_Tier IN ([C1ID], [C1Cost], [C2ID], [C2Cost], [C3ID], [C3Cost])
) Pvt
Demonstrative SQL Fiddle
pivot
标签下的问题。那里有一些可以帮助你的。 - Jonathan Leffler