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

Bagaimana cara memutar jumlah kolom yang tidak diketahui &tidak ada agregat di SQL Server?

Sementara jawaban M.Ali akan memberi Anda hasilnya, karena Anda menggunakan SQL Server 2012 saya akan melepas name dan address kolom sedikit berbeda untuk mendapatkan hasil akhir.

Karena Anda menggunakan SQL Server 2012, Anda dapat menggunakan CROSS APPLY dengan VALUES untuk melepaskan beberapa kolom ini menjadi beberapa baris. Tapi sebelum Anda melakukannya, saya akan menggunakan row_number() untuk mendapatkan jumlah total kolom baru yang akan Anda miliki.

Kode untuk "UNPIVOT" data menggunakan CROSS APPLY terlihat seperti:

select d.loanid, 
  col = c.col + cast(seq as varchar(10)),
  c.value
from
(
  select loanid, name, address,
    row_number() over(partition by loanid
                      order by loanid) seq
  from yourtable
) d
cross apply
(
  values
    ('name', name),
    ('address', address)
) c(col, value);

Lihat SQL Fiddle dengan Demo. Ini akan membuat data Anda menjadi format yang mirip dengan:

| LOANID |      COL |    VALUE |
|--------|----------|----------|
|      1 |    name1 |     John |
|      1 | address1 | New York |
|      1 |    name2 |     Carl |
|      1 | address2 | New York |
|      1 |    name3 |    Henry |
|      1 | address3 |   Boston |

Anda sekarang memiliki satu kolom COL dengan semua nama kolom baru Anda dan nilai yang terkait juga berada dalam satu kolom. Nama kolom baru sekarang memiliki nomor di akhir (1, 2, 3, dll) berdasarkan berapa banyak total entri yang Anda miliki per loanid . Sekarang Anda dapat menerapkan PIVOT:

select loanid,
  name1, address1, name2, address2,
  name3, address3
from
(
  select d.loanid, 
    col = c.col + cast(seq as varchar(10)),
    c.value
  from
  (
    select loanid, name, address,
      row_number() over(partition by loanid
                        order by loanid) seq
    from yourtable
  ) d
  cross apply
  (
    values
      ('name', name),
      ('address', address)
  ) c(col, value)
) src
pivot
(
  max(value)
  for col in (name1, address1, name2, address2,
              name3, address3)
) piv;

Lihat SQL Fiddle dengan Demo. Terakhir jika Anda tidak tahu berapa banyak pasangan Name dan Address Anda akan memiliki maka Anda dapat menggunakan SQL dinamis:

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

select @cols = STUFF((SELECT ',' + QUOTENAME(col+cast(seq as varchar(10))) 
                    from 
                    (
                      select row_number() over(partition by loanid
                                                order by loanid) seq
                      from yourtable
                    ) d
                    cross apply
                    (
                      select 'Name', 1 union all
                      select 'Address', 2
                    ) c (col, so)
                    group by seq, col, so
                    order by seq, so
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT loanid,' + @cols + ' 
            from 
            (
              select d.loanid, 
                col = c.col + cast(seq as varchar(10)),
                c.value
              from
              (
                select loanid, name, address,
                  row_number() over(partition by loanid
                                    order by loanid) seq
                from yourtable
              ) d
              cross apply
              (
                values
                  (''name'', name),
                  (''address'', address)
              ) c(col, value)
            ) x
            pivot 
            (
                max(value)
                for col in (' + @cols + ')
            ) p '

exec sp_executesql @query;

Lihat SQL Fiddle dengan Demo. Kedua versi memberikan hasil:

| LOANID |  NAME1 | ADDRESS1 |  NAME2 | ADDRESS2 |  NAME3 | ADDRESS3 |
|--------|--------|----------|--------|----------|--------|----------|
|      1 |   John | New York |   Carl | New York |  Henry |   Boston |
|      2 | Robert |  Chicago | (null) |   (null) | (null) |   (null) |
|      3 | Joanne |       LA |  Chris |       LA | (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. Masukkan hasil prosedur tersimpan ke dalam tabel sementara

  2. Bagaimana cara mengelompokkan pada rentang berkelanjutan?

  3. Memantau Penghitung Kinerja melalui PERFMON | Pemecahan Masalah Kinerja SQL Server -3

  4. Bagaimana Fungsi STRING_ESCAPE() Bekerja di SQL Server (T-SQL)

  5. Perbaikan untuk Masalah Pembuatan Ulang Indeks Online SQL Server 2012 &2014