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

अज्ञात स्तंभ सामग्री को पिवट करें

आपको जिस SQL ​​​​की आवश्यकता होगी वह है:

SELECT  Course1_ID = MAX(CASE WHEN RowNum = 1 THEN ID END),
        Course1_Name = MAX(CASE WHEN RowNum = 1 THEN Name END),
        Course2_ID = MAX(CASE WHEN RowNum = 2 THEN ID END),
        Course2_Name = MAX(CASE WHEN RowNum = 2 THEN Name END),
        Course3_ID = MAX(CASE WHEN RowNum = 3 THEN ID END),
        Course3_Name = MAX(CASE WHEN RowNum = 3 THEN Name END)
FROM    (   SELECT  ID, 
                    Name, 
                    RowNum = ROW_NUMBER() OVER(ORDER BY ID)
            FROM    Courses
        ) C;

लेकिन अज्ञात सामग्री के साथ आपको इसे गतिशील रूप से उत्पन्न करना होगा:

DECLARE @SQL NVARCHAR(MAX) = 'SELECT ' + 
                            STUFF(( SELECT  ',Course' + RowNum + '_ID = MAX(CASE WHEN RowNum = ' + RowNum + ' THEN ID END)
                                            ,Course' + RowNum + '_Name = MAX(CASE WHEN RowNum = ' + RowNum + ' THEN Name END)'
                                    FROM    (   SELECT  RowNum = CAST(ROW_NUMBER() OVER(ORDER BY ID) AS VARCHAR(10))
                                                FROM    Courses
                                            ) c
                                    FOR XML PATH(''), TYPE
                                ).value('.', 'NVARCHAR(MAX)'), 1, 1, '') + 
                                ' FROM (    SELECT  ID, 
                                                    Name, 
                                                    RowNum = ROW_NUMBER() OVER(ORDER BY ID)
                                            FROM    Courses
                                        ) C;'

EXECUTE SP_EXECUTESQL @SQL;

SQL Fiddle पर उदाहरण

समान परिणाम प्राप्त करने का दूसरा तरीका है:

DECLARE @SQL NVARCHAR(MAX) = '';
SELECT   @SQL = @SQL + 
                    ',Course' + RowNum + '_ID = MAX(CASE WHEN RowNum = ' + RowNum + ' THEN ID END)
                    ,Course' + RowNum + '_Name = MAX(CASE WHEN RowNum = ' + RowNum + ' THEN Name END)'
FROM    (   SELECT  RowNum = CAST(ROW_NUMBER() OVER(ORDER BY ID) AS VARCHAR(10))
            FROM    Courses
        ) c;

SET @SQL = 'SELECT ' + STUFF(@SQL, 1, 1, '') + '
            FROM (  SELECT  ID, 
                            Name, 
                            RowNum = ROW_NUMBER() OVER(ORDER BY ID)
                    FROM    Courses
                ) c;';

EXECUTE SP_EXECUTESQL @SQL;

इससे पंक्तियों को स्तंभों में संयोजित करने के लिए महंगे XML एक्सटेंशन हटा दिए जाते हैं

SQL Fiddle पर उदाहरण

यदि पाठ्यक्रमों का क्रम बिल्कुल भी प्रासंगिक है तो आप केवल ROW_NUMBER में खंड द्वारा क्रम बदल सकते हैं समारोह।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. टी-एसक्यूएल स्थिति के सही नहीं होने पर भी यदि कथन का मूल्यांकन करता प्रतीत होता है

  2. दिनांक और/या समय को वर्ण स्ट्रिंग से कनवर्ट करते समय रूपांतरण विफल रहा

  3. SQL सर्वर में अग्रणी और अनुगामी वर्ण कैसे निकालें?

  4. मैं SSRS में एक ड्रॉप-डाउन सूची पैरामीटर को -- All -- का डिफ़ॉल्ट मान रखने की अनुमति कैसे दूं?

  5. एसएसआईएस:आप किसी अन्य पैकेज में स्क्रिप्टिंग घटक में स्क्रिप्ट का पुन:उपयोग कैसे करते हैं?