Có một số cách để bạn có thể chuyển đổi dữ liệu từ hàng thành cột.
Vì bạn đang sử dụng SQL Server 2008, nên bạn có thể sử dụng hàm PIVOT.
Tôi khuyên bạn nên sử dụng row_number()
chức năng để hỗ trợ trong việc xoay vòng dữ liệu. Nếu bạn có một số lượng giá trị đã biết, thì bạn có thể viết mã cố định cho truy vấn:
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;
Xem SQL Fiddle with Demo .
Đối với tình huống của bạn, bạn đã nói rằng bạn sẽ có một số lượng giá trị không xác định cần phải là cột. Trong trường hợp đó, bạn sẽ muốn sử dụng SQL động để tạo chuỗi truy vấn để thực thi:
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)
Xem SQL Fiddle with Demo . Cả hai đều cho kết quả:
| 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 |