आप प्रॉपर्टीनाम में एक पंक्ति संख्या जोड़ सकते हैं जो आपको वह करने की अनुमति देगा जो आप चाहते हैं:
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
मैं यहां मान रहा हूं कि ENTITYID बच्चों को माता-पिता से जोड़ता है, अर्थात एक ही व्यक्ति के सभी बच्चों का ENTITYID 1 है, लेकिन आपका उदाहरण कायला के लिए 2 दिखाता है।
ये रहा एक डेमो:SQL Fiddle
यदि आप केवल चाइल्ड फ़ील्ड के लिए नंबर चाहते हैं तो आप इसे डाल सकते हैं:
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
फिर अपने IN() स्टेटमेंट में अन्य फ़ील्ड से नंबर हटा दें।
बोनस प्रश्न- उपरोक्त गतिशील रूप से करें: हम यह नहीं मानना चाहते हैं कि लोगों के केवल एक पति या पत्नी या 2.3 बच्चे हैं, इसलिए हम पूरी तरह से गतिशील रूप से करते हैं:
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)
नोट:आदेश केवल पति-पत्नी 1-9 और बच्चों 1-9 के लिए काम करेगा, आप इसे सूट करने के लिए समायोजित कर सकते हैं, लेकिन यह वैसे भी मनमाना है।