Có một số cách để bạn có thể chuyển đổi dữ liệu. Một số sử dụng chức năng tổng hợp và một số khác thì không. Nhưng mặc dù bạn đang xoay vòng chuỗi nhưng bạn vẫn có thể áp dụng tổng hợp.
tổng hợp với TRƯỜNG HỢP:
select name,
max(case when category = 'A' then 'X' else '' end) CategoryA,
max(case when category = 'B' then 'X' else '' end) CategoryB,
max(case when category = 'C' then 'X' else '' end) CategoryC,
max(case when category = 'D' then 'X' else '' end) CategoryD
from yourtable
group by name
Xem SQL Fiddle with Demo
tĩnh Pivot:
Bạn vẫn có thể sử dụng PIVOT
chức năng để chuyển đổi dữ liệu mặc dù các giá trị là chuỗi. Nếu bạn có một số danh mục đã biết, thì bạn có thể mã hóa khó khăn truy vấn:
select name,
coalesce(A, '') CategoryA,
coalesce(B, '') CategoryB,
coalesce(C, '') CategoryC,
coalesce(C, '') CategoryD
from
(
select name, category, 'X' flag
from yourtable
) d
pivot
(
max(flag)
for category in (A, B, C, D)
) piv
Xem SQL Fiddle with Demo.
động Pivot:
Nếu bạn có một số không rõ chủng loại, sau đó bạn có thể sử dụng SQL động:
DECLARE @cols AS NVARCHAR(MAX),
@colsNull AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT ',' + QUOTENAME(category)
from yourtable
group by category
order by category
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
select @colsNull = STUFF((SELECT ', coalesce(' + QUOTENAME(category)+', '''') as '+QUOTENAME('Category'+category)
from yourtable
group by category
order by category
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT name, ' + @colsNull + '
from
(
select name, category, ''X'' flag
from yourtable
) x
pivot
(
max(flag)
for category in (' + @cols + ')
) p '
execute(@query)
Xem SQL Fiddle with Demo.
Nhiều tham gia:
select c1.name,
case when c1.category is not null then 'X' else '' end as CategoryA,
case when c2.category is not null then 'X' else '' end as CategoryB,
case when c3.category is not null then 'X' else '' end as CategoryC,
case when c4.category is not null then 'X' else '' end as CategoryD
from yourtable c1
left join yourtable c2
on c1.name = c2.name
and c2.category = 'B'
left join yourtable c3
on c1.name = c3.name
and c3.category = 'C'
left join yourtable c4
on c1.name = c4.name
and c4.category = 'D'
where c1.category = 'A'
Xem SQL Fiddle with Demo
Mọi thắc mắc sẽ cho kết quả:
| NAME | CATEGORYA | CATEGORYB | CATEGORYC | CATEGORYD |
--------------------------------------------------------
| Joe | X | X | | X |
| Mary | X | | X | X |
thể trùng lặp của [Nhận ROWS như COLUMNS (SQL Server động PIVOT query) ] (http://stackoverflow.com/questions/12074939/get-rows-as-columns-sql-server-dynamic-pivot-query) – RichardTheKiwi