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.