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

SQL सर्वर 2005 में डायनेमिक कॉलम के साथ क्रॉसस्टैब क्वेरी

PIVOT करने के दो तरीके हैं स्थैतिक जहां आप मूल्यों को हार्ड-कोड करते हैं और गतिशील जहां आपके द्वारा निष्पादित करते समय कॉलम निर्धारित किए जाते हैं।

भले ही आप एक गतिशील संस्करण चाहते हैं, कभी-कभी स्थिर PIVOT . से शुरू करना आसान होता है और फिर एक गतिशील की दिशा में काम करें।

स्थिर संस्करण:

SELECT studentid, name, sex,[C], [C++], [English], [Database], [Math], total, average
from 
(
  select s1.studentid, name, sex, subjectname, score, total, average
  from Score s1
  inner join
  (
    select studentid, sum(score) total, avg(score) average
    from score
    group by studentid
  ) s2
    on s1.studentid = s2.studentid
) x
pivot 
(
   min(score)
   for subjectname in ([C], [C++], [English], [Database], [Math])
) p

देखें SQL Fiddle with डेमो

अब, यदि आप उन मानों को नहीं जानते हैं जो रूपांतरित होंगे तो आप इसके लिए डायनामिक SQL का उपयोग कर सकते हैं:

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(SubjectName) 
                    from Score
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')



set @query = 'SELECT studentid, name, sex,' + @cols + ', total, average
              from 
             (
                select s1.studentid, name, sex, subjectname, score, total, average
                from Score s1
                inner join
                (
                  select studentid, sum(score) total, avg(score) average
                  from score
                  group by studentid
                ) s2
                  on s1.studentid = s2.studentid
            ) x
            pivot 
            (
                min(score)
                for subjectname in (' + @cols + ')
            ) p '

execute(@query)

देखें SQL Fiddle with Demo

दोनों संस्करण समान परिणाम देंगे।

यदि आपके पास PIVOT नहीं है, तो केवल उत्तर को पूर्णांकित करने के लिए फ़ंक्शन, तो आप CASE . का उपयोग करके यह परिणाम प्राप्त कर सकते हैं और एक समग्र कार्य:

select s1.studentid, name, sex, 
  min(case when subjectname = 'C' then score end) C,
  min(case when subjectname = 'C++' then score end) [C++],
  min(case when subjectname = 'English' then score end) English,
  min(case when subjectname = 'Database' then score end) [Database],
  min(case when subjectname = 'Math' then score end) Math,
  total, average
from Score s1
inner join
(
  select studentid, sum(score) total, avg(score) average
  from score
  group by studentid
) s2
  on s1.studentid = s2.studentid
group by s1.studentid, name, sex, total, average

देखें 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. SQL सर्वर:केवल MAX (DATE) वाली पंक्तियों का चयन करें

  4. एक्सेल स्प्रेडशीट से एसक्यूएल सर्वर 2008 तालिका में डेटा कैसे निर्यात करें

  5. Ubuntu 18.04 पर SQL सर्वर कैसे स्थापित करें