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

डायनामिक पिवट (पंक्ति से कॉलम तक)

आपका वांछित आउटपुट बिल्कुल स्पष्ट नहीं है, लेकिन आप दोनों का उपयोग कर सकते हैं UNPIVOT और PIVOT परिणाम प्राप्त करने के लिए कार्य करें

यदि आप स्तंभों की संख्या जानते हैं, तो आप मानों को हार्ड कोड कर सकते हैं:

select *
from
(
  select id, 
    'Instance'+cast(instance as varchar(10))+'_'+col col, 
    value
  from 
  (
    select id, 
      Instance, 
      Name, 
      cast(Size as varchar(50)) Size,
      Tech
    from yourtable
  ) x
  unpivot
  (
    value
    for col in (Name, Size, Tech)
  ) u
) x1
pivot
(
  max(value) 
  for col in
    ([Instance0_Name], [Instance0_Size], [Instance0_Tech], 
     [Instance1_Name], [Instance1_Size], [Instance1_Tech], 
     [Instance2_Name], [Instance2_Size], [Instance2_Tech], 
     [Instance3_Name], [Instance3_Size], [Instance3_Tech])
) p

देखें SQL Fiddle with Demo

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

DECLARE @query  AS NVARCHAR(MAX),
    @colsPivot as  NVARCHAR(MAX)

select @colsPivot = STUFF((SELECT ',' 
                      + quotename('Instance'+ cast(instance as varchar(10))+'_'+c.name)
                    from yourtable t
                    cross apply sys.columns as C
                    where C.object_id = object_id('yourtable') and
                         C.name not in ('id', 'instance')
                    group by t.instance, c.name
                    order by t.instance
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')


set @query 
  = 'select *
      from
      (
        select id, 
          ''Instance''+cast(instance as varchar(10))+''_''+col col, 
          value
        from 
        (
          select id, 
            Instance, 
            Name, 
            cast(Size as varchar(50)) Size,
            Tech
          from yourtable
        ) x
        unpivot
        (
          value
          for col in (Name, Size, Tech)
        ) u 
      ) x1
      pivot
      (
        max(value)
        for col in ('+ @colspivot +')
      ) p'

exec(@query)

देखें SQL Fiddle with Demo

यदि परिणाम सही नहीं है, तो कृपया अपना ओपी संपादित करें और अपने द्वारा प्रदान की गई दोनों आईडी से अपेक्षित परिणाम पोस्ट करें।




  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. एक वर्चर डेटा प्रकार को डेटाटाइम डेटा प्रकार में बदलने के परिणामस्वरूप एक आउट-ऑफ-रेंज मान होता है

  4. जहां में (गैर-मौजूद कॉलमनाम चुनें) अप्रत्याशित व्यवहार का कारण बनता है

  5. एसक्यूएल सर्वर में सबक्वायरी का उपयोग कर अद्यतन क्वेरी