चूंकि आप SQL सर्वर का उपयोग कर रहे हैं, इसलिए पंक्तियों को पंक्तियों में परिवर्तित करने के कई अलग-अलग तरीके हैं। तुम एक मामला अभिव्यक्ति के साथ एक समग्र समारोह का उपयोग कर सकते हैं:
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 with Demo देखें।
आप धुरी समारोह का उपयोग करने के परिणाम प्राप्त करना चाहते हैं, तो मैं पहले कॉलम unpivoting सिफारिश करेंगे empState
, empStDate
और empEndDate
ताकि आप एकाधिक पंक्तियों पहले होगा। आप UNPIVOT समारोह का उपयोग कर सकते या पार डेटा कन्वर्ट करने के लिए लागू कोड होगा:
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);
Demo देखें। एक बार डेटा unpivoted है, तो आप धुरी समारोह लागू कर सकते हैं तो अंतिम कोड होगा:
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 with Demo देखें।
संस्करणों ऊपर
गु महान यदि आप empindex
की एक सीमित संख्या है काम करेंगे, लेकिन यदि नहीं तो आप गतिशील एसक्यूएल का उपयोग कर सकते हैं:
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;
एसक्यूएल देखें Fiddle with Demo
आप सम्मिलित करना इन प्रश्नों का उपयोग कर सकते अपने DestTbl
में, या इस प्रारूप में डेटा को संग्रहीत करने के बजाय, अब आपके पास वांछित परिणाम प्राप्त करने के लिए एक प्रश्न है।
इन क्वेरी प्रारूप में डेटा जगह:
| 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) |
पिवट को msaccess में रूपांतरित करने के रूप में भी जाना जाता है। आपका प्रश्न अद्वितीय है कि इसके परिणामस्वरूप कोशिकाओं में टेक्स्ट (पूर्णांक नहीं) भी है। कुल फ़ंक्शन को अभी भी लागू करना होगा, इस मामले में MIN() को टेक्स्ट मानों पर ठीक करना चाहिए, भले ही केवल 1 टेक्स्ट मान हो। – hamish