Please try:
SELECT
Heading,
A Package_A,
B Package_B,
C Package_C,
D Package_D
FROM (
SELECT * FROM YourTable
) up
PIVOT (sum(Limit) FOR Package IN (A, B, C, D)) AS pvt
Question
I have the following SQL Server 2008 TABLE:
Heading Limit Package
X Charges 200 A
X Charges 300 B
X Charges 400 C
X Charges 500 D
Y Charges 550 A
Y Charges 450 B
Y Charges 350 C
Y Charges 250 D
Now I would like to get data in following representation:
Heading Package_A Package_B Package_C Package_D
X Charges 200 300 400 500
Y Charges 550 450 350 250
Solution
Please try:
SELECT
Heading,
A Package_A,
B Package_B,
C Package_C,
D Package_D
FROM (
SELECT * FROM YourTable
) up
PIVOT (sum(Limit) FOR Package IN (A, B, C, D)) AS pvt
OTHER TIPS
SELECT
Heading,
[A] as Package_A,
[B] as Package_B,
[C] as Package_C,
[D] as Package_D
FROM
TableX
PIVOT
(
SUM(LIMIT)
FOR Package IN ([A], [B], [C], [D])
) x;
The dynamic case (where the values of package are not known up front) is addressed here
Please, update a table name where is from table at below :
declare
@cols nvarchar(max),
@stmt nvarchar(max)
select @cols = isnull(@cols + ', ', '') + '[' + T.Package+ ']'
from (select distinct Package from TABLE1) as T
select @stmt = '
select *
from TABLE1 as T
pivot
(
max(T.VALUE)
for T.Package in (' + @cols + ')
) as P'
exec sp_executesql @stmt = @stmt
Declare @t table( Heading varchar(50), Limit int,Package varchar(20))
insert into @t
select 'X Charges', 200,'A' union all
select 'X Charges', 300,'B' union all
select 'X Charges', 400,'C' union all
select 'X Charges', 500,'D' union all
select 'Y Charges', 550,'A' union all
select 'Y Charges', 450,'B' union all
select 'Y Charges', 350,'C' union all
select 'Y Charges', 250,'D'
select * from
(select * from @t)t4
pivot (min(limit) for Package in([A],[B],[C],[D]))pvt
In order to do this dynamically:
Declare
@cols varchar(max)
select @cols = stuff(
(select distinct ',' + quotename(package)
from data
for xml path (''), type
).value('.', 'varchar(max)'), 1,1, '')
declare
@query varchar(max)
set @query = 'select distinct heading, ' + @cols + ' from
(
select heading, Limit, Package
from data
) X
pivot
(
MAX(Limit)
for Package in ('+@cols + ')
) p'
exec(@query)