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

Konversi baris ke kolom secara efisien di server sql

Ada beberapa cara untuk mengubah data dari beberapa baris menjadi kolom.

Menggunakan PIVOT

Di SQL Server Anda dapat menggunakan PIVOT fungsi untuk mengubah data dari baris ke kolom:

select Firstname, Amount, PostalCode, LastName, AccountNumber
from
(
  select value, columnname
  from yourtable
) d
pivot
(
  max(value)
  for columnname in (Firstname, Amount, PostalCode, LastName, AccountNumber)
) piv;

Lihat Demo.

Pivot dengan jumlah columnnames yang tidak diketahui

Jika Anda memiliki nomor columnnames yang tidak diketahui yang ingin Anda transpose, maka Anda dapat menggunakan SQL dinamis:

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

select @cols = STUFF((SELECT ',' + QUOTENAME(ColumnName) 
                    from yourtable
                    group by ColumnName, id
                    order by id
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = N'SELECT ' + @cols + N' from 
             (
                select value, ColumnName
                from yourtable
            ) x
            pivot 
            (
                max(value)
                for ColumnName in (' + @cols + N')
            ) p '

exec sp_executesql @query;

Lihat Demo.

Menggunakan fungsi agregat

Jika Anda tidak ingin menggunakan PIVOT fungsi, maka Anda dapat menggunakan fungsi agregat dengan CASE ekspresi:

select
  max(case when columnname = 'FirstName' then value end) Firstname,
  max(case when columnname = 'Amount' then value end) Amount,
  max(case when columnname = 'PostalCode' then value end) PostalCode,
  max(case when columnname = 'LastName' then value end) LastName,
  max(case when columnname = 'AccountNumber' then value end) AccountNumber
from yourtable

Lihat Demo.

Menggunakan beberapa gabungan

Ini juga dapat diselesaikan dengan menggunakan beberapa gabungan, tetapi Anda akan memerlukan beberapa kolom untuk mengaitkan setiap baris yang tidak Anda miliki dalam data sampel Anda. Tapi sintaks dasarnya adalah:

select fn.value as FirstName,
  a.value as Amount,
  pc.value as PostalCode,
  ln.value as LastName,
  an.value as AccountNumber
from yourtable fn
left join yourtable a
  on fn.somecol = a.somecol
  and a.columnname = 'Amount'
left join yourtable pc
  on fn.somecol = pc.somecol
  and pc.columnname = 'PostalCode'
left join yourtable ln
  on fn.somecol = ln.somecol
  and ln.columnname = 'LastName'
left join yourtable an
  on fn.somecol = an.somecol
  and an.columnname = 'AccountNumber'
where fn.columnname = 'Firstname'


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 2 Cara Membuat Tabel Jika Tidak Ada di SQL Server

  2. Menyimpan gambar di SQL Server?

  3. Mengapa saya tidak dapat melakukan fungsi agregat pada ekspresi yang berisi agregat tetapi saya dapat melakukannya dengan membuat pernyataan pilih baru di sekitarnya?

  4. Bagaimana Saya Bisa Masuk dan Menemukan Kueri Termahal?

  5. Konversikan UTC Milidetik ke DATETIME di server SQL