कॉलम को पंक्तियों में बदलने के लिए आप UNPIVOT फ़ंक्शन का उपयोग कर सकते हैं:
select id, entityId,
indicatorname,
indicatorvalue
from yourtable
unpivot
(
indicatorvalue
for indicatorname in (Indicator1, Indicator2, Indicator3)
) unpiv;
ध्यान दें, आपके द्वारा अनपिवोट किए जा रहे कॉलम के डेटाटाइप समान होने चाहिए ताकि आपको अनपिवट को लागू करने से पहले डेटाटाइप को कन्वर्ट करना पड़े।
आप CROSS APPLY
का भी इस्तेमाल कर सकते हैं कॉलम बदलने के लिए UNION ALL के साथ:
select id, entityid,
indicatorname,
indicatorvalue
from yourtable
cross apply
(
select 'Indicator1', Indicator1 union all
select 'Indicator2', Indicator2 union all
select 'Indicator3', Indicator3 union all
select 'Indicator4', Indicator4
) c (indicatorname, indicatorvalue);
SQL सर्वर के आपके संस्करण के आधार पर आप VALUES क्लॉज के साथ CROSS APPLY का भी उपयोग कर सकते हैं:
select id, entityid,
indicatorname,
indicatorvalue
from yourtable
cross apply
(
values
('Indicator1', Indicator1),
('Indicator2', Indicator2),
('Indicator3', Indicator3),
('Indicator4', Indicator4)
) c (indicatorname, indicatorvalue);
अंत में, यदि आपके पास अनपिवट करने के लिए 150 कॉलम हैं और आप पूरी क्वेरी को हार्ड-कोड नहीं करना चाहते हैं, तो आप डायनेमिक SQL का उपयोग करके sql स्टेटमेंट जेनरेट कर सकते हैं:
DECLARE @colsUnpivot AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @colsUnpivot
= stuff((select ','+quotename(C.column_name)
from information_schema.columns as C
where C.table_name = 'yourtable' and
C.column_name like 'Indicator%'
for xml path('')), 1, 1, '')
set @query
= 'select id, entityId,
indicatorname,
indicatorvalue
from yourtable
unpivot
(
indicatorvalue
for indicatorname in ('+ @colsunpivot +')
) u'
exec sp_executesql @query;