Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Pivot beberapa kolom berdasarkan satu kolom di SQL Server

Karena Anda menggunakan SQL Server, ada beberapa cara berbeda untuk mengubah baris menjadi kolom. Anda dapat menggunakan fungsi agregat dengan ekspresi 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;

Lihat SQL Fiddle dengan Demo.

Jika Anda ingin menggunakan fungsi PIVOT untuk mendapatkan hasilnya, maka saya akan merekomendasikan unpivoting kolom empState terlebih dahulu. , empStDate dan empEndDate jadi Anda akan memiliki beberapa baris terlebih dahulu. Anda dapat menggunakan fungsi UNPIVOT atau CROSS APPLY untuk mengubah data menjadi kode:

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);

Lihat Demo. Setelah data tidak dipivot, maka Anda dapat menerapkan fungsi PIVOT sehingga kode akhirnya menjadi:

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;

Lihat SQL Fiddle dengan Demo.

Versi di atas akan berfungsi dengan baik jika Anda memiliki empindex dalam jumlah terbatas , tetapi jika tidak, Anda dapat menggunakan SQL dinamis:

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;

Lihat SQL Fiddle dengan Demo

Anda dapat menggunakan kueri ini untuk INSERT INTO DestTbl . Anda , atau alih-alih menyimpan data dalam format ini, Anda sekarang memiliki kueri untuk mendapatkan hasil yang diinginkan.

Kueri ini menempatkan data dalam format:

| 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. Menggunakan tupel dalam klausa SQL IN

  2. Permintaan PIVOT pada catatan Berbeda

  3. Bagaimana saya bisa menentukan di SQL Server jika rentang dateTime tumpang tindih dengan yang lain?

  4. Cara Memeriksa apakah Kolom yang Dihitung "Bertahan" di SQL Server

  5. Cara Menggabungkan String dan Nilai NULL di SQL Server