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

SQL Server 2008 Data vertikal ke Horizontal

Anda dapat menggunakan fungsi PIVOT untuk mengonversi baris data menjadi kolom.

Kueri asli Anda dapat digunakan untuk mengambil semua data, satu-satunya perubahan yang akan saya lakukan adalah mengecualikan kolom b.field_id karena ini akan mengubah tampilan akhir dari hasil.

Jika Anda memiliki daftar field_name yang diketahui nilai yang ingin Anda ubah menjadi kolom, lalu Anda dapat membuat hard-code kueri Anda:

select app_id,
  [First Name], [Last Name], [DOB],
  [Mailing Addr], [Zip]
from
(
  SELECT 
     a.app_id, 
     c.field_name,
     b.field_value 
  FROM table1 a
  INNER JOIN table2 b 
    ON a.app_id = b.app_id
  INNER JOIN table3 c 
    ON b.field_id = c.field_id 
) d
pivot
(
  max(field_value)
  for field_name in ([First Name], [Last Name], [DOB],
                     [Mailing Addr], [Zip])
) piv;

Lihat SQL Fiddle dengan Demo.

Tetapi jika Anda akan memiliki jumlah nilai yang tidak diketahui untuk field_name , maka Anda perlu menerapkan SQL dinamis untuk mendapatkan hasilnya:

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

select @cols = STUFF((SELECT ',' + QUOTENAME(Field_name) 
                    from Table3
                    group by field_name, Field_id
                    order by Field_id
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT app_id,' + @cols + ' 
            from 
            (
              SELECT 
                 a.app_id, 
                 c.field_name,
                 b.field_value 
              FROM table1 a
              INNER JOIN table2 b 
                ON a.app_id = b.app_id
              INNER JOIN table3 c 
                ON b.field_id = c.field_id 
            ) x
            pivot 
            (
                max(field_value)
                for field_name in (' + @cols + ')
            ) p '

execute sp_executesql @query;

Lihat SQL Fiddle dengan Demo. Kedua hal ini akan memberikan hasil:

| APP_ID | FIRST NAME | LAST NAME |      DOB |    MAILING ADDR |   ZIP |
------------------------------------------------------------------------
|   1234 |        Joe |     Smith | 10/15/72 |     PO Box 1234 | 12345 |
|   1239 |        Bob |   Johnson | 12/01/78 | 1234 N Star Ave | 12456 |


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara Memperbaiki "Pernyataan ALTER TABLE SWITCH gagal" Msg 4982 (SQL Server)

  2. Cara menghasilkan Pernyataan Sisipkan dari File Teks untuk Tabel SQL Server di SQL Server - Tutorial SQL Server / TSQL Bagian 106

  3. Lewati tabel sebagai parameter ke sql server UDF

  4. Apa metode terbaik untuk meneruskan parameter ke SQLCommand?

  5. Berapa ukuran batch yang direkomendasikan untuk SqlBulkCopy?