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