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

किसी विशिष्ट कॉलम के आधार पर पंक्तियों से डेटा को किसी अन्य डेटा संरचना में कैसे बदलें

आप जो परिणाम चाहते हैं उसे प्राप्त करने के लिए आप अनपिवट/पिवट का उपयोग कर सकते हैं। कुछ अलग तरीके हैं जिनसे आप परिणाम प्राप्त कर सकते हैं, यदि आपके पास सीमित संख्या में मान हैं तो आप क्वेरी को हार्ड-कोड कर सकते हैं लेकिन यदि आपके पास अज्ञात संख्या में मान हैं तो आपको गतिशील SQL का उपयोग करने की आवश्यकता होगी।

UNPIVOT प्रक्रिया c1 . के एकाधिक स्तंभों को रूपांतरित कर देगी , आदि` कई पंक्तियों में। एक बार जब डेटा कई पंक्तियों में होता है तो आप आसानी से PIVOT फ़ंक्शन को लागू कर सकते हैं। आप कई कॉलम से डेटा को कनवर्ट करने के लिए अनपिवट फ़ंक्शन या क्रॉस एप्लाई का उपयोग कर सकते हैं:

select id,
  col = 'Service'+Service+'_'+col+'_'+cast(seq as varchar(10)),
  value
from
(
  select id, service, c1, cn
    , row_number() over(partition by id
                        order by service) seq
  from yourtable
) t
cross apply
(
  select 'c1', c1 union all
  select 'cn', cn
) c (col, value)

देखें SQL Fiddle with Demo . क्रॉस अप्लाई आपके डेटा को प्रारूप में बदल देगा:

| ID |           COL | VALUE |
|  1 | ServiceA_c1_1 |     5 |
|  1 | ServiceA_cn_1 |     3 |
|  1 | ServiceB_c1_2 |     2 |
|  1 | ServiceB_cn_2 |     1 |
|  2 | ServiceA_c1_1 |     9 |
|  2 | ServiceA_cn_1 |     4 |

एक बार डेटा इस प्रारूप में हो जाने पर आप PIVOT लागू कर सकते हैं:

select id, ServiceA_c1_1, ServiceA_cn_1,
  ServiceB_c1_2, ServiceB_cn_2
from
(
  select id,
    col = 'Service'+Service+'_'+col+'_'+cast(seq as varchar(10)),
    value
  from
  (
    select id, service, c1, cn
      , row_number() over(partition by id
                          order by service) seq
    from yourtable
  ) t
  cross apply
  (
    select 'c1', c1 union all
    select 'cn', cn
  ) c (col, value)
) d
pivot
(
  max(value)
  for col in (ServiceA_c1_1, ServiceA_cn_1,
              ServiceB_c1_2, ServiceB_cn_2)
) piv;

देखें SQL Fiddle with Demo .

फिर यदि आपके पास अज्ञात संख्या में मान हैं, तो आप उपरोक्त क्वेरी को डायनेमिक SQL में बदल सकते हैं:

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

select @cols = STUFF((SELECT ',' + QUOTENAME('Service'+Service+'_'+col+'_'+cast(seq as varchar(10))) 
                    from 
                    (
                      select service, 
                        row_number() over(partition by id
                                          order by service) seq
                      from yourtable 
                    )d
                    cross apply
                    (
                      select 'c1', 1 union all
                      select 'cn', 2
                    ) c (col, so)
                    group by seq, Service, col, so
                    order by seq, so
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT id, ' + @cols + ' 
            from 
            (
              select id,
                col = ''Service''+Service+''_''+col+''_''+cast(seq as varchar(10)),
                value
              from
              (
                select id, service, c1, cn
                  , row_number() over(partition by id
                                      order by service) seq
                from yourtable
              ) t
              cross apply
              (
                select ''c1'', c1 union all
                select ''cn'', cn
              ) c (col, value)
            ) x
            pivot 
            (
                max(value)
                for col in (' + @cols + ')
            ) p '

execute sp_executesql @query;

देखें SQL Fiddle with Demo . दोनों एक परिणाम देंगे:

| ID | SERVICEA_C1_1 | SERVICEA_CN_1 | SERVICEB_C1_2 | SERVICEB_CN_2 |
|  1 |             5 |             3 |             2 |             1 |
|  2 |             9 |             4 |        (null) |        (null) |



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर लेनदेन लॉग फ़ाइल से डेटा पुनर्प्राप्त करने के तरीके

  2. दो पंक्तियों के मान घटाएँ और इसे एक नए कॉलम में डालें (बाद की पंक्तियाँ नहीं)

  3. SQL सर्वर 2017 में एक दृश्य बनाएँ

  4. SQL सर्वर कर्सर के लिए चरणों को परिभाषित करें - SQL सर्वर / TSQL ट्यूटोरियल

  5. एक्सएमएल नोड्स से मूल्यों की क्वेरी कैसे करें?