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

Xoay vòng nhiều cột dựa trên một cột trong SQL Server

Vì bạn đang sử dụng SQL Server nên có một số cách khác nhau để bạn có thể chuyển đổi các hàng thành cột. Bạn có thể sử dụng một hàm tổng hợp với biểu thức CASE:

select empid,
  max(case when empindex = 1 then empstate end) empState1,
  max(case when empindex = 1 then empStDate end) empStDate1,
  max(case when empindex = 1 then empEndDate end) empEndDate1,
  max(case when empindex = 2 then empstate end) empState2,
  max(case when empindex = 2 then empStDate end) empStDate2,
  max(case when empindex = 2 then empEndDate end) empEndDate2
from sourcetbl
group by empid;

Xem SQL Fiddle với Demo.

Nếu bạn muốn sử dụng hàm PIVOT để nhận kết quả, thì trước tiên tôi khuyên bạn nên bỏ chia các cột empState , empStDateempEndDate vì vậy bạn sẽ có nhiều hàng trước. Bạn có thể sử dụng chức năng UNPIVOT hoặc ÁP DỤNG CHÉO để chuyển đổi dữ liệu mà mã sẽ là:

select empid, col+cast(empindex as varchar(10)) col,  value
from sourcetbl
cross apply
(
  select 'empstate', empstate union all
  select 'empstdate', convert(varchar(10), empstdate, 120) union all
  select 'empenddate', convert(varchar(10), empenddate, 120)
) c (col, value);

Xem Demo. Sau khi dữ liệu được bỏ phân chia, bạn có thể áp dụng hàm PIVOT để mã cuối cùng sẽ là:

select empid,
  empState1, empStDate1, empEndDate1,
  empState2, empStDate2, empEndDate2
from 
(
  select empid, col+cast(empindex as varchar(10)) col,  value
  from sourcetbl
  cross apply
  (
    select 'empstate', empstate union all
    select 'empstdate', convert(varchar(10), empstdate, 120) union all
    select 'empenddate', convert(varchar(10), empenddate, 120)
  ) c (col, value)
) d
pivot
(
  max(value)
  for col in (empState1, empStDate1, empEndDate1,
              empState2, empStDate2, empEndDate2)
) piv;

Xem SQL Fiddle với Demo.

Các phiên bản trên sẽ hoạt động tốt nếu bạn có một số lượng giới hạn empindex , nhưng nếu không thì bạn có thể sử dụng SQL động:

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT ',' + QUOTENAME(col+cast(empindex as varchar(10))) 
                    from SourceTbl
                    cross apply
                    (
                      select 'empstate', 1 union all
                      select 'empstdate', 2 union all
                      select 'empenddate', 3
                    ) c (col, so)
                    group by col, so, empindex
                    order by empindex, so
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT empid,' + @cols + ' 
            from 
            (
                select empid, col+cast(empindex as varchar(10)) col,  value
                from sourcetbl
                cross apply
                (
                  select ''empstate'', empstate union all
                  select ''empstdate'', convert(varchar(10), empstdate, 120) union all
                  select ''empenddate'', convert(varchar(10), empenddate, 120)
                ) c (col, value)
            ) x
            pivot 
            (
                max(value)
                for col in (' + @cols + ')
            ) p '

execute sp_executesql @query;

Xem SQL Fiddle với Demo

Bạn có thể sử dụng các truy vấn này để CHÈN VÀO DestTbl của bạn hoặc thay vì lưu trữ dữ liệu ở định dạng này, bây giờ bạn có một truy vấn để nhận được kết quả mong muốn.

Các truy vấn này đặt dữ liệu ở định dạng:

| EMPID | EMPSTATE1 | EMPSTDATE1 | EMPENDDATE1 | EMPSTATE2 | EMPSTDATE2 | EMPENDDATE2 |
---------------------------------------------------------------------------------------
|    10 |        AL | 2012-01-01 |  2012-12-01 |        FL | 2012-02-01 |  2013-02-01 |
|    15 |        FL | 2012-03-20 |  2099-01-01 |    (null) |     (null) |      (null) |


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách xóa công việc tác nhân máy chủ SQL trong Azure Data Studio

  2. Lệnh Sql JOIN có ảnh hưởng đến hiệu suất không?

  3. Kích hoạt đăng nhập trong SQL Server

  4. Cách ISNUMERIC () hoạt động trong SQL Server

  5. Làm cách nào để trả về số ngẫu nhiên dưới dạng một cột trong SQL Server 2005?