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
Was it helpful?

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

SQL Fiddle

OTHER TIPS

Fiddle here

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)    

Demo: http://sqlfiddle.com/#!3/8a42a/4

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top