0

Check the following table:

--------------------------------
ID    Value    GroupName
--------------------------------
1     10       A
2     12       B
3     19       A
4     5        B
5     9        A
6     12       B
7     17       C
8     21       C
9     8        C
10    15       A
--------------------------------

I want to have the following output:

-------------------------
A     B      C
-------------------------
10    12     17
19    5      21
9     12     8
15    NULL   NULL
-------------------------

So, all values in 'GroupName' field will become a new column.
Does anyone know how to do this in SQL 2008?

Thank you.

Haminteu
  • 1,292
  • 4
  • 23
  • 49

1 Answers1

2

Please try using PIVOT; and the given below example is for only 3 static values A, B and C:

select [A], [B], [C] From(
    select 
        Value, GroupName, 
        ROW_NUMBER() over (partition by GroupName order by GroupName) RN
    From 
        tbl
)up pivot (sum(value) for GroupName in ([A], [B], [C]))x

For dynamic values,

DECLARE @pivv NVARCHAR(MAX),@Query NVARCHAR(MAX)

SELECT @pivv=COALESCE(@pivv+',','')+ QUOTENAME(GroupName) 
from tbl group by GroupName

IF ISNULL(@pivv, '')<>''
set @Query=
    'select '+@pivv+' From(
        select 
            Value, GroupName, 
            ROW_NUMBER() over (partition by GroupName order by GroupName) RN
        From 
            tbl
    )up pivot (sum(value) for GroupName in ('+@pivv+'))x'

exec (@Query)

SQL Fiddle Demo

TechDo
  • 18,398
  • 3
  • 51
  • 64