My preferred solution would be to use a conditional aggregate, for example:
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
However, this can also be done using the PIVOT SQL-Server function. However, this requires UNION because PIVOT does not allow multiple units in one 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
SQL exponential script
source
share