Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

SQL सर्वर में पंक्ति डेटा को कॉलम में बदलें

आप प्रॉपर्टीनाम में एक पंक्ति संख्या जोड़ सकते हैं जो आपको वह करने की अनुमति देगा जो आप चाहते हैं:

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 के लिए काम करेगा, आप इसे सूट करने के लिए समायोजित कर सकते हैं, लेकिन यह वैसे भी मनमाना है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Xquery के साथ xml से डेटा निकालने का सबसे अच्छा तरीका

  2. विशेष वर्णों वाली CSV फ़ाइल बनाने के लिए Excel का उपयोग करना और फिर SSIS का उपयोग करके इसे db में आयात करना

  3. SQL सर्वर डेटाबेस में डेटा खोए बिना सीडीसी सक्षम तालिका से कॉलम कैसे जोड़ें या छोड़ें - SQL सर्वर ट्यूटोरियल

  4. SQL क्वेरी:गिनती के अनुसार क्रम की आवश्यकता है, अधिकांश शीर्ष पर होना चाहिए, बाकी इस प्रकार हैं

  5. एक संग्रहीत कार्यविधि (.NET) पर तालिका मान पैरामीटर के लिए रिक्त सूची या शून्य मान को बाध्य करना