Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

SQL Server 2012 PIVOT không có tổng hợp

Có một số cách mà bạn có thể chuyển đổi dữ liệu. Một số sử dụng một hàm tổng hợp và những người khác thì không. Nhưng ngay cả khi bạn đang xoay một chuỗi, bạn vẫn có thể áp dụng một tổng hợp.

Tổng hợp với CASE:

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ổng hợp tĩnh:

Bạn vẫn có thể sử dụng PIVOT hàm để biế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ể viết mã cố định cho 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 .

Xoay vòng động:

Nếu bạn có một số danh mục không xác định, thì 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 với Demo

Tất cả các truy vấn sẽ cho kết quả:

| NAME | CATEGORYA | CATEGORYB | CATEGORYC | CATEGORYD |
--------------------------------------------------------
|  Joe |         X |         X |           |         X |
| Mary |         X |           |         X |         X |



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server v.Next:Hiệu suất STRING_AGG, Phần 2

  2. Bộ định vị hàng trong chỉ mục không phân cụm

  3. truyền tham số trong hàm có giá trị bảng bằng cách sử dụng câu lệnh select

  4. Xác định kích thước hàng cho bảng

  5. Tại sao UDF lại chậm hơn nhiều so với truy vấn con?