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

SQL 2012 - पिवट और अनपिवोट

आप तालिका को स्थानांतरित करने के लिए गतिशील SQL का उपयोग कर सकते हैं:

DECLARE @cols NVARCHAR(MAX) = 
                STUFF((SELECT DISTINCT ',' + QUOTENAME(CONCAT([Year], '_', [Month]))
                      FROM #tab
                      FOR XML PATH(''), TYPE
                     ).value('.', 'NVARCHAR(MAX)') 
                     , 1, 1, '');

DECLARE @query NVARCHAR(MAX) = 
FORMATMESSAGE(
N'SELECT col_name, customer, %s
FROM (SELECT [year_month] = CONCAT([Year], ''_'', [Month]),
             Customer, No_Trans, spend, points
      FROM #tab) AS sub
UNPIVOT
(
    val FOR col_name  IN (No_trans, spend, points)
) AS unpvt
PIVOT
(
    MAX(val) FOR [year_month] IN (%s)
) AS pvt
ORDER BY customer, col_name;', @cols, @cols); 

EXEC [dbo].[sp_executesql] @query;

LiveDemo

आउटपुट:

╔══════════╦══════════╦════════╦════════╦════════╗
║   col    ║ customer ║ 2015_1 ║ 2015_2 ║ 2015_3 ║
╠══════════╬══════════╬════════╬════════╬════════╣
║ No_Trans ║        1 ║     30 ║     20 ║     10 ║
║ points   ║        1 ║     10 ║      5 ║     15 ║
║ spend    ║        1 ║    400 ║    150 ║    500 ║
║ No_Trans ║        2 ║      5 ║        ║        ║
║ points   ║        2 ║      7 ║        ║        ║
║ spend    ║        2 ║    100 ║        ║        ║
╚══════════╩══════════╩════════╩════════╩════════╝

अगर आप zeros चाहते हैं लापता स्थिति में आप ISNULL/COALESCE . का उपयोग कर सकते हैं . ध्यान रखें कि प्रत्येक डेटाटाटाइप को 0 (int) . द्वारा प्रतिस्थापित नहीं किया जा सकता है

LiveDemo2

संपादित करें:

FORMATMESSAGE %s . को बदलने का शानदार तरीका है स्ट्रिंग के साथ। इसे सरल REPLACE . द्वारा आसानी से बदला जा सकता है :

 DECLARE @query NVARCHAR(MAX) = 
 N'SELECT col1, col2, <placeholder>
   FROM ...
   ...
   PIVOT( MAX(col) IN col2 IN (<placeholder>)
   ...';

 SET @query = REPLACE(@query, '<placeholder', @cols);

 -- for debug
 PRINT @query;

यह कैसे काम करता है:

  1. जनरेट [year_month] सबक्वेरी में कॉलम
  2. UNPIVOT डेटा (कॉलम टू रो)
  3. PIVOT परिणाम (पंक्तियों से कॉलम तक)
  4. इसे डायनेमिक-एसक्यूएल के साथ लपेटें ताकि [year_month] जाने बिना कॉलम जेनरेट करने की अनुमति मिल सके अग्रिम में।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SqlClient.SqlException:प्रतीक्षा कार्रवाई का समय समाप्त हो गया

  2. लेन-देन रोलबैक के साथ भी SQL पहचान (ऑटोनंबर) को बढ़ाया जाता है

  3. SQL सर्वर में अस्थायी तालिका की दो पंक्तियों पर ऑपरेशन घटाएं

  4. SQL सर्वर CSV को कई पंक्तियों में विभाजित करता है

  5. Sproc . के भीतर से एक संग्रहित प्रक्रिया के कॉलर की पहचान कैसे करें