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

SQL सर्वर:5 कॉलम से अधिक गतिशील पिवट

परिणाम प्राप्त करने के लिए, आपको Total में डेटा को अनपिवट करते हुए देखना होगा और Volume अंतिम परिणाम प्राप्त करने के लिए PIVOT फ़ंक्शन को लागू करने से पहले कॉलम पहले। मेरा सुझाव होगा कि पहले क्वेरी का हार्ड-कोडेड संस्करण लिखें और फिर उसे डायनेमिक SQL में बदलें।

UNPIVOT प्रक्रिया इन कई स्तंभों को पंक्तियों में बदल देती है। UNPIVOT करने के कुछ तरीके हैं, आप UNPIVOT फ़ंक्शन का उपयोग कर सकते हैं या आप CROSS APPLY का उपयोग कर सकते हैं। डेटा को अनपिवट करने के लिए कोड इस तरह होगा:

select id, 
    col = cast(t_year as varchar(4))+'_'+t_type+'_'+col, 
    value
from ATM_TRANSACTIONS t
cross apply
(
    select 'total', total union all
    select 'volume', volume
) c (col, value);

यह आपको प्रारूप में डेटा देता है:

+-----+---------------+-------+
| id  |      col      | value |
+-----+---------------+-------+
| DD1 | 2008_A_total  |  1000 |
| DD1 | 2008_A_volume |    10 |
| DD1 | 2008_B_total  |  2000 |
| DD1 | 2008_B_volume |    20 |
| DD1 | 2008_C_total  |  3000 |
| DD1 | 2008_C_volume |    30 |
+-----+---------------+-------+

तब आप PIVOT फ़ंक्शन लागू कर सकते हैं:

select ID, 
    [2008_A_total], [2008_A_volume], [2008_B_total], [2008_B_volume],
    [2008_C_total], [2008_C_volume], [2009_A_total], [2009_A_volume]
from
(
    select id, 
        col = cast(t_year as varchar(4))+'_'+t_type+'_'+col, 
        value
    from ATM_TRANSACTIONS t
    cross apply
    (
        select 'total', total union all
        select 'volume', volume
    ) c (col, value)
) d
pivot
(
    max(value)
    for col in ([2008_A_total], [2008_A_volume], [2008_B_total], [2008_B_volume],
                [2008_C_total], [2008_C_volume], [2009_A_total], [2009_A_volume])
) piv;

अब जब आपके पास सही तर्क है, तो आप इसे गतिशील SQL में बदल सकते हैं:

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT ',' + QUOTENAME(cast(t_year as varchar(4))+'_'+t_type+'_'+col) 
                    from ATM_TRANSACTIONS t
                    cross apply
                    (
                        select 'total', 1 union all
                        select 'volume', 2
                    ) c (col, so)
                    group by col, so, T_TYPE, T_YEAR
                    order by T_YEAR, T_TYPE, so
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT id,' + @cols + ' 
            from 
            (
                select id, 
                    col = cast(t_year as varchar(4))+''_''+t_type+''_''+col, 
                    value
                from ATM_TRANSACTIONS t
                cross apply
                (
                    select ''total'', total union all
                    select ''volume'', volume
                ) c (col, value)
            ) x
            pivot 
            (
                max(value)
                for col in (' + @cols + ')
            ) p '

execute sp_executesql @query;

यह आपको एक परिणाम देगा:

+-----+--------------+---------------+--------------+---------------+--------------+---------------+--------------+---------------+--------------+---------------+--------------+---------------+
| id  | 2008_A_total | 2008_A_volume | 2008_B_total | 2008_B_volume | 2008_C_total | 2008_C_volume | 2009_A_total | 2009_A_volume | 2009_B_total | 2009_B_volume | 2009_C_total | 2009_C_volume |
+-----+--------------+---------------+--------------+---------------+--------------+---------------+--------------+---------------+--------------+---------------+--------------+---------------+
| DD1 |         1000 |            10 |         2000 |            20 |         3000 |            30 |         4000 |            40 |         5000 |            50 |         6000 |            60 |
| DD2 |         7000 |            70 |         8000 |            80 |         9000 |            90 |        10000 |           100 |        11000 |           110 |         1200 |           120 |
+-----+--------------+---------------+--------------+---------------+--------------+---------------+--------------+---------------+--------------+---------------+--------------+---------------+


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. sys.dm_os_host_info गतिशील प्रबंधन दृश्य के साथ SQL सर्वर में ऑपरेटिंग सिस्टम संस्करण जानकारी लौटाएं

  2. अंतर जानने के लिए लिनक्स बनाम विंडोज परफॉर्मेंस टेस्ट पर एमएस एसक्यूएल सर्वर

  3. इकाई ढांचे के माध्यम से टी-एसक्यूएल संग्रहित प्रो में इनट्स की सरणी पास करना

  4. SQL सर्वर में स्तंभ द्वारा समूह के साथ अल्पविराम विभाजकों में समेकित परिणाम प्राप्त करने के लिए SQL क्वेरी

  5. SQL सर्वर (T-SQL) में डेटाबेस मेल के लिए कॉन्फ़िगरेशन सेटिंग्स कैसे बदलें