मेरा सुझाव है कि जब आप डायनेमिक एसक्यूएल के साथ काम कर रहे हों तो हमेशा पहले हार्ड-कोडेड क्वेरी लिखें, ताकि आप लॉजिक को सही कर सकें, फिर इसे डायनेमिक एसक्यूएल में बदल सकें।
चूंकि आप डेटा के 3 कॉलम पिवट करने का प्रयास कर रहे हैं, इसलिए मैं पहले type_ds
को अनपिवट करूंगा , expdt
और comdt` कॉलम, फिर PIVOT फ़ंक्शन लागू करें।
क्वेरी का हार्ड-कोडेड संस्करण होगा:
SELECT *
FROM
(
select pro_id,
type_ds = case
when col ='type_ds'
then type_ds
else type_ds+col end,
value
from
(
SELECT A.Pro_Id,
c.Type_DS,
convert(varchar(10), b.ExpDt, 120) ExpDt,
convert(varchar(10), b.ComDt, 120) ComDt
FROM dbo.Project A
left join [dbo].[Prj_App] B
on A.Pro_id = B.Pro_Id
right outer join dbo.Approval_Type C
on B.App_Id = C.App_ID
) s
cross apply
(
select 'type_ds', type_ds union all
select 'expdt', expdt union all
select 'comdt', comdt
) c (col, value)
) data
PIVOT
(
MAX(value)
FOR Type_DS IN (RMC2, RMC2expdt, RMC2comdt,
RMC1, RMC1expdt, RMC1comdt)
) pvt1
देखें SQL Fiddle with Demo . अब जब आपके पास क्वेरी का कार्यशील संस्करण है, तो आप इसे आसानी से डायनेमिक SQL में बदल सकते हैं:
DECLARE @SQL1 NVARCHAR(MAX) = ''
DECLARE @SQL NVARCHAR(MAX) = ''
SELECT @SQL1 = STUFF((SELECT ',' + QUOTENAME(Type_Ds) + ',' + QUOTENAME(Type_Ds + 'ExpDt') + ',' + QUOTENAME(Type_Ds + 'ComDt')
from dbo.Approval_Type
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
SET @SQL = 'SELECT *
FROM
(
select pro_id,
type_ds = case
when col =''type_ds''
then type_ds
else type_ds+col end,
value
from
(
SELECT A.Pro_Id,
c.Type_DS,
convert(varchar(10), b.ExpDt, 120) ExpDt,
convert(varchar(10), b.ComDt, 120) ComDt
FROM dbo.Project A
left join [dbo].[Prj_App] B
on A.Pro_id = B.Pro_Id
right outer join dbo.Approval_Type C
on B.App_Id = C.App_ID
) s
cross apply
(
select ''type_ds'', type_ds union all
select ''expdt'', expdt union all
select ''comdt'', comdt
) c (col, value)
) data
PIVOT
(
MAX(value)
FOR Type_DS IN (' + @SQL1 + ')
) pvt1 '
--print @SQL
EXECUTE SP_EXECUTESQL @SQL
देखें SQL Fiddle with Demo