Istnieje kilka sposobów przekształcania danych z wierszy w kolumny.
Ponieważ używasz SQL Server 2008, możesz użyć funkcji PIVOT.
Sugerowałbym użycie row_number()
funkcja wspomagająca obracanie danych. Jeśli masz znaną liczbę wartości, możesz na stałe zakodować zapytanie:
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;
Zobacz SQL Fiddle z wersją demonstracyjną .
W swojej sytuacji stwierdziłeś, że będziesz mieć nieznaną liczbę wartości, które muszą być kolumnami. W takim przypadku będziesz chciał użyć dynamicznego SQL do wygenerowania ciągu zapytania do wykonania:
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)
Zobacz SQL Fiddle z wersją demonstracyjną . Oba dają wynik:
| 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 |