Es gibt einige Möglichkeiten, wie Sie die Daten von Zeilen in Spalten umwandeln können.
Da Sie SQL Server 2008 verwenden, können Sie die PIVOT-Funktion verwenden.
Ich würde vorschlagen, die row_number()
zu verwenden Funktion zur Unterstützung beim Pivotieren der Daten. Wenn Sie eine bekannte Anzahl von Werten haben, können Sie die Abfrage fest codieren:
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;
Siehe SQL-Geige mit Demo .
Für Ihre Situation haben Sie angegeben, dass Sie eine unbekannte Anzahl von Werten haben, die Spalten sein müssen. In diesem Fall sollten Sie dynamisches SQL verwenden, um die auszuführende Abfragezeichenfolge zu generieren:
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)
Siehe SQL Fiddle mit Demo . Beide geben ein Ergebnis:
| 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 |