U kunt een rijnummer aan de eigenschapnaam toevoegen waarmee u kunt doen wat u wilt:
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
Ik neem hier aan dat de ENTITYID de kinderen aan de ouder koppelt, dwz alle kinderen voor dezelfde persoon hebben een ENTITYID van 1, maar uw voorbeeld toont een 2 voor Kayala.
Hier is een demo:SQL Fiddle
Als je alleen de cijfers voor de KIND-velden wilt, kun je dit plaatsen:
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
Verwijder vervolgens het nummer uit de andere velden in uw IN()-statement.
Bonusvraag- Doe het bovenstaande dynamisch: We willen er niet van uitgaan dat mensen maar één echtgenoot of 2,3 kinderen hebben, dus we doen het hele stuk dynamisch:
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)
Opmerking:de volgorde werkt alleen voor echtgenoten 1-9 en kinderen 1-9, je kunt dat aanpassen, maar het is hoe dan ook willekeurig.