Il existe plusieurs façons de transformer les données des lignes en colonnes.
Puisque vous utilisez SQL Server 2008, vous pouvez utiliser la fonction PIVOT.
Je suggérerais d'utiliser le row_number()
fonction pour aider à faire pivoter les données. Si vous avez un nombre connu de valeurs, vous pouvez coder en dur la requête :
select user, category1, category2, category3, category4
from
(
select [user], category,
'Category'+cast(row_number() over(partition by [user]
order by [user]) as varchar(3)) rn
from yt
) d
pivot
(
max(category)
for rn in (category1, category2, category3, category4)
) piv;
Voir SQL Fiddle avec démo .
Pour votre situation, vous avez déclaré que vous aurez un nombre inconnu de valeurs qui doivent être des colonnes. Dans ce cas, vous souhaiterez utiliser le SQL dynamique pour générer la chaîne de requête à exécuter :
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME('Category'+cast(row_number() over(partition by [user]
order by [user]) as varchar(3)))
from yt
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT [user],' + @cols + '
from
(
select [user], category,
''Category''+cast(row_number() over(partition by [user]
order by [user]) as varchar(3)) rn
from yt
) d
pivot
(
max(category)
for rn in (' + @cols + ')
) p '
execute(@query)
Voir SQL Fiddle avec démo . Les deux donnent un résultat :
| USER | CATEGORY1 | CATEGORY2 | CATEGORY3 | CATEGORY4 |
----------------------------------------------------------
| Bruce | Laptop | Beer | (null) | (null) |
| Chuck | Cell Phone | (null) | (null) | (null) |
| Jack | Shoes | Tie | Glass | (null) |
| Peggy | Shoe | Skirt | Bat | Cat |