आप जो परिणाम चाहते हैं उसे प्राप्त करने के लिए आप अनपिवट/पिवट का उपयोग कर सकते हैं। कुछ अलग तरीके हैं जिनसे आप परिणाम प्राप्त कर सकते हैं, यदि आपके पास सीमित संख्या में मान हैं तो आप क्वेरी को हार्ड-कोड कर सकते हैं लेकिन यदि आपके पास अज्ञात संख्या में मान हैं तो आपको गतिशील SQL का उपयोग करने की आवश्यकता होगी।
UNPIVOT प्रक्रिया c1
. के एकाधिक स्तंभों को रूपांतरित कर देगी , आदि` कई पंक्तियों में। एक बार जब डेटा कई पंक्तियों में होता है तो आप आसानी से PIVOT फ़ंक्शन को लागू कर सकते हैं। आप कई कॉलम से डेटा को कनवर्ट करने के लिए अनपिवट फ़ंक्शन या क्रॉस एप्लाई का उपयोग कर सकते हैं:
select id,
col = 'Service'+Service+'_'+col+'_'+cast(seq as varchar(10)),
value
from
(
select id, service, c1, cn
, row_number() over(partition by id
order by service) seq
from yourtable
) t
cross apply
(
select 'c1', c1 union all
select 'cn', cn
) c (col, value)
देखें SQL Fiddle with Demo . क्रॉस अप्लाई आपके डेटा को प्रारूप में बदल देगा:
| ID | COL | VALUE |
| 1 | ServiceA_c1_1 | 5 |
| 1 | ServiceA_cn_1 | 3 |
| 1 | ServiceB_c1_2 | 2 |
| 1 | ServiceB_cn_2 | 1 |
| 2 | ServiceA_c1_1 | 9 |
| 2 | ServiceA_cn_1 | 4 |
एक बार डेटा इस प्रारूप में हो जाने पर आप PIVOT लागू कर सकते हैं:
select id, ServiceA_c1_1, ServiceA_cn_1,
ServiceB_c1_2, ServiceB_cn_2
from
(
select id,
col = 'Service'+Service+'_'+col+'_'+cast(seq as varchar(10)),
value
from
(
select id, service, c1, cn
, row_number() over(partition by id
order by service) seq
from yourtable
) t
cross apply
(
select 'c1', c1 union all
select 'cn', cn
) c (col, value)
) d
pivot
(
max(value)
for col in (ServiceA_c1_1, ServiceA_cn_1,
ServiceB_c1_2, ServiceB_cn_2)
) piv;
देखें SQL Fiddle with Demo .
फिर यदि आपके पास अज्ञात संख्या में मान हैं, तो आप उपरोक्त क्वेरी को डायनेमिक SQL में बदल सकते हैं:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT ',' + QUOTENAME('Service'+Service+'_'+col+'_'+cast(seq as varchar(10)))
from
(
select service,
row_number() over(partition by id
order by service) seq
from yourtable
)d
cross apply
(
select 'c1', 1 union all
select 'cn', 2
) c (col, so)
group by seq, Service, col, so
order by seq, so
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT id, ' + @cols + '
from
(
select id,
col = ''Service''+Service+''_''+col+''_''+cast(seq as varchar(10)),
value
from
(
select id, service, c1, cn
, row_number() over(partition by id
order by service) seq
from yourtable
) t
cross apply
(
select ''c1'', c1 union all
select ''cn'', cn
) c (col, value)
) x
pivot
(
max(value)
for col in (' + @cols + ')
) p '
execute sp_executesql @query;
देखें SQL Fiddle with Demo . दोनों एक परिणाम देंगे:
| ID | SERVICEA_C1_1 | SERVICEA_CN_1 | SERVICEB_C1_2 | SERVICEB_CN_2 |
| 1 | 5 | 3 | 2 | 1 |
| 2 | 9 | 4 | (null) | (null) |