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

Konversikan data baris ke kolom di SQL Server

Anda dapat menambahkan nomor baris ke nama properti yang memungkinkan Anda melakukan apa yang Anda inginkan:

SELECT * FROM
(
SELECT ENTITYID
       , PROPERTYNAME = PROPERTYNAME + CAST(ROW_NUMBER() OVER(PARTITION BY ENTITYID, PROPERTYNAME ORDER BY PROPERTYVALUE) AS VARCHAR(5))
      ,PROPERTYVALUE
FROM #STAGING   
) AS T
PIVOT (MAX(PROPERTYVALUE) FOR PROPERTYNAME IN (NAME1, SPOUSE1, CHILD1, CHILD2, CHILD3, CHILD4, CHILD5)) AS T2

Saya berasumsi di sini bahwa ENTITYID mengikat anak-anak ke orang tua, yaitu semua anak untuk orang yang sama memiliki ENTITYID 1, tetapi contoh Anda menunjukkan 2 untuk Kayala.

Berikut adalah Demo:SQL Fiddle

Jika Anda hanya menginginkan nomor untuk bidang ANAK, Anda dapat memasukkan ini:

PROPERTYNAME = CASE WHEN PROPERTYNAME LIKE '%CHILD%' THEN PROPERTYNAME + CAST(ROW_NUMBER() OVER(PARTITION BY ENTITYID, PROPERTYNAME ORDER BY PROPERTYVALUE) AS VARCHAR(5))                                                   ELSE PROPERTYNAME END

Kemudian hapus nomor dari bidang lain dalam pernyataan IN() Anda.

Pertanyaan Bonus- Lakukan hal di atas secara dinamis: Kami tidak ingin berasumsi bahwa orang hanya memiliki satu pasangan atau 2,3 ​​anak, jadi kami melakukan semuanya secara dinamis:

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

SELECT @cols = STUFF((SELECT ',' + PROPERTYNAME
                    FROM (SELECT DISTINCT PROPERTYNAME = PROPERTYNAME + CAST(ROW_NUMBER() OVER(PARTITION BY ENTITYID, PROPERTYNAME ORDER BY PROPERTYVALUE) AS VARCHAR(5))
                          FROM STAGING )sub
                    ORDER BY CASE WHEN PROPERTYNAME LIKE '%NAME%' THEN 1
                        WHEN PROPERTYNAME LIKE '%SPOUSE%' THEN 2
                        WHEN PROPERTYNAME LIKE '%CHILD%' THEN 3
                    ELSE 4
                    END
                    ,RIGHT(PROPERTYNAME,1) 
                  FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')


SET @query = 'SELECT * FROM
                (
                SELECT ENTITYID, PROPERTYNAME = PROPERTYNAME + CAST(ROW_NUMBER() OVER(PARTITION BY ENTITYID, PROPERTYNAME ORDER BY PROPERTYVALUE) AS VARCHAR(5)),PROPERTYVALUE
                FROM STAGING   
                ) AS T
                PIVOT (MAX(PROPERTYVALUE) FOR PROPERTYNAME IN ('[email protected]+')) AS T2

'
EXEC(@query)

Catatan:Pemesanan hanya akan berfungsi untuk pasangan 1-9 dan anak-anak 1-9, Anda dapat menyesuaikannya sesuai keinginan, tetapi tetap saja sewenang-wenang.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Penyortiran Kunci Utama

  2. Tidak dapat masuk ke SQL Server 2008 melalui utilitas baris perintah

  3. Menghapus Akun Email Database (SSMS)

  4. Bagaimana cara mengubah nilai kolom identitas secara terprogram?

  5. Apakah Anda Mengukur Kinerja SQL Server dengan Metrik Ini?