चूंकि आप 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) |