2013-04-02 36 views
9

Tôi có dữ liệu mẫu sau:SQL Server 2012 PIVOT mà không tổng hợp

Id Name  Category 
----------------------- 
1  Joe  A 
2  Joe  B 
3  Joe  D 
4  Mary  A 
5  Mary  C 
6  Mary  D 

Tôi muốn hiển thị các loại một người thuộc về thích vậy:

Name CategoryA CategoryB CategoryC CategoryD 
-------------------------------------------------- 
Joe  X   X      X 
Mary  X      X   X 

1 và 0 có thể được sử dụng thay cho X và trống.

Điều này có mùi giống như câu hỏi của PIVOT đối với tôi.

+0

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

Trả lời

25

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 | 
+0

Heh ... Tôi đã wa tching câu trả lời được chỉnh sửa/tinh chỉnh. Cảm ơn bạn đã chỉnh sửa câu trả lời để đưa vào yêu cầu của tôi rằng kết quả chứa X/khoảng trắng. Điều này đủ điều kiện làm câu trả lời được chấp nhận. –

+2

@BlakeB. Yeah nó được gọi là không đọc đầy đủ các câu hỏi, xin lỗi về điều đó. :) – Taryn

+0

Bật phiên bản "Tổng hợp với CASE" của giải pháp này hoạt động tốt hơn nhiều so với các giải pháp PIVOT. –

Các vấn đề liên quan