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

SQL सर्वर में एक कॉलम के आधार पर कई कॉलम पिवट करें

चूंकि आप SQL सर्वर का उपयोग कर रहे हैं, इसलिए कई अलग-अलग तरीके हैं जिनसे आप पंक्तियों को कॉलम में बदल सकते हैं। आप CASE व्यंजक के साथ समग्र फ़ंक्शन का उपयोग कर सकते हैं:

select empid,
  max(case when empindex = 1 then empstate end) empState1,
  max(case when empindex = 1 then empStDate end) empStDate1,
  max(case when empindex = 1 then empEndDate end) empEndDate1,
  max(case when empindex = 2 then empstate end) empState2,
  max(case when empindex = 2 then empStDate end) empStDate2,
  max(case when empindex = 2 then empEndDate end) empEndDate2
from sourcetbl
group by empid;

डेमो के साथ SQL Fiddle देखें।

यदि आप परिणाम प्राप्त करने के लिए PIVOT फ़ंक्शन का उपयोग करना चाहते हैं, तो मैं पहले कॉलम empState को अनपिवोट करने की अनुशंसा करता हूं। , empStDate और empEndDate तो आपके पास पहले कई पंक्तियां होंगी। आप डेटा को परिवर्तित करने के लिए UNPIVOT फ़ंक्शन या CROSS APPLY का उपयोग कर सकते हैं, जो कोड होगा:

select empid, col+cast(empindex as varchar(10)) col,  value
from sourcetbl
cross apply
(
  select 'empstate', empstate union all
  select 'empstdate', convert(varchar(10), empstdate, 120) union all
  select 'empenddate', convert(varchar(10), empenddate, 120)
) c (col, value);

डेमो देखें। एक बार जब डेटा अप्रकाशित हो जाता है, तो आप PIVOT फ़ंक्शन लागू कर सकते हैं, इसलिए अंतिम कोड होगा:

select empid,
  empState1, empStDate1, empEndDate1,
  empState2, empStDate2, empEndDate2
from 
(
  select empid, col+cast(empindex as varchar(10)) col,  value
  from sourcetbl
  cross apply
  (
    select 'empstate', empstate union all
    select 'empstdate', convert(varchar(10), empstdate, 120) union all
    select 'empenddate', convert(varchar(10), empenddate, 120)
  ) c (col, value)
) d
pivot
(
  max(value)
  for col in (empState1, empStDate1, empEndDate1,
              empState2, empStDate2, empEndDate2)
) piv;

डेमो के साथ SQL Fiddle देखें।

यदि आपके पास सीमित संख्या में empindex . है तो उपरोक्त संस्करण बहुत अच्छा काम करेंगे , लेकिन यदि नहीं तो आप गतिशील SQL का उपयोग कर सकते हैं:

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

select @cols = STUFF((SELECT ',' + QUOTENAME(col+cast(empindex as varchar(10))) 
                    from SourceTbl
                    cross apply
                    (
                      select 'empstate', 1 union all
                      select 'empstdate', 2 union all
                      select 'empenddate', 3
                    ) c (col, so)
                    group by col, so, empindex
                    order by empindex, so
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT empid,' + @cols + ' 
            from 
            (
                select empid, col+cast(empindex as varchar(10)) col,  value
                from sourcetbl
                cross apply
                (
                  select ''empstate'', empstate union all
                  select ''empstdate'', convert(varchar(10), empstdate, 120) union all
                  select ''empenddate'', convert(varchar(10), empenddate, 120)
                ) c (col, value)
            ) x
            pivot 
            (
                max(value)
                for col in (' + @cols + ')
            ) p '

execute sp_executesql @query;

डेमो के साथ SQL Fiddle देखें

आप इन प्रश्नों का उपयोग अपने DestTbl . में INSERT करने के लिए कर सकते हैं , या इस प्रारूप में डेटा संग्रहीत करने के बजाय, अब आपके पास वांछित परिणाम प्राप्त करने के लिए एक प्रश्न है।

ये क्वेरी डेटा को प्रारूप में रखती हैं:

| EMPID | EMPSTATE1 | EMPSTDATE1 | EMPENDDATE1 | EMPSTATE2 | EMPSTDATE2 | EMPENDDATE2 |
---------------------------------------------------------------------------------------
|    10 |        AL | 2012-01-01 |  2012-12-01 |        FL | 2012-02-01 |  2013-02-01 |
|    15 |        FL | 2012-03-20 |  2099-01-01 |    (null) |     (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. मैं कम से कम समय में 10 मिलियन रिकॉर्ड कैसे सम्मिलित कर सकता हूं?

  2. SQL सर्वर प्रबंधन स्टूडियो (SSMS) क्या है?

  3. वेब से निष्पादित होने पर क्वेरी का समय समाप्त हो जाता है, लेकिन SSMS से निष्पादित होने पर सुपर-फास्ट

  4. CTE कर्सर/व्युत्पन्न तालिका/उपश्रेणियों/अस्थायी तालिका आदि से बेहतर क्यों है?

  5. टी-एसक्यूएल में पिवट डेटा