मैं आपकी क्वेरी को थोड़ा अलग सेट कर दूंगा क्योंकि यह गतिशील है कि कॉलम नाम बदल रहे हैं, फिर भी आपने कॉलम की संख्या को हार्ड-कोड किया है।
सबसे पहले, मैं उन महीनों/वर्षों की सूची तैयार करने के लिए एक पुनरावर्ती सीटीई का उपयोग करूंगा जिन्हें आप बनाना चाहते हैं।
DECLARE @startDate datetime
SET @startDate = '2013-01-01'
;with dates as
(
select @startdate datelist, 1 sp
union all
select dateadd(month, 1, datelist), sp+1
from dates
where sp+1 <= 5 -- change this number 5 to the number of months you need
)
select sp,
REPLACE(SUBSTRING(CONVERT(varchar(11), datelist, 13), 4, 8), ' ', '') MONTHANDYEAR
from dates
देखें SQL Fiddle with Demo . यह स्वचालित रूप से वर्ष के साथ आपकी 5 महीनों की सूची बनाने जा रहा है। तब आप 5 कॉलम को हार्ड-कोडिंग नहीं कर रहे हैं। आपकी वर्तमान क्वेरी उतनी लचीली नहीं है जितनी हो सकती है। क्या होगा यदि आप 12 महीने चाहते हैं, तो आपको अपना कोड बदलना होगा।
एक बार जब आप तिथियों की सूची तैयार कर लेंगे, तो मैं इसे एक अस्थायी तालिका में डाल दूंगा ताकि आप कॉलम प्राप्त करने के लिए इसका उपयोग कर सकें।
कॉलम की सूची प्राप्त करने के लिए कोड है:
select @cols = STUFF((SELECT ',' + QUOTENAME(monthandyear)
from #datesTemp
group by monthandyear, sp
order by sp
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
select @colNames = STUFF((SELECT ', isnull(' + QUOTENAME(monthandyear)+', 0) as '+QUOTENAME(monthandyear)
from #datesTemp
group by monthandyear, sp
order by sp
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
देखें SQL Fiddle with Demo
. आप देखेंगे कि इसके दो संस्करण हैं। पहला वाला @cols
उन स्तंभों की सूची प्राप्त करता है जिनका उपयोग pivot
. में किया जाएगा . दूसरा @colNames
अंतिम SELECT
. में उपयोग किया जाएगा null
. को बदलने के लिए सूची शून्य के साथ मान।
फिर आप इसे सब एक साथ रखें और कोड होगा:(नोट:मैं आपके उत्तर के एक संस्करण का उपयोग कर रहा हूं पिछला प्रश्न )
DECLARE @cols AS NVARCHAR(MAX),
@colNames AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX),
@startDate datetime
SET @startDate = '2013-01-01'
;with dates as
(
select @startdate datelist, 1 sp
union all
select dateadd(month, 1, datelist), sp+1
from dates
where sp+1 <= 5 -- change this number 5 to the number of months you need
)
select sp,
REPLACE(SUBSTRING(CONVERT(varchar(11), datelist, 13), 4, 8), ' ', '') MONTHANDYEAR
into #datesTemp
from dates
select @cols = STUFF((SELECT ',' + QUOTENAME(monthandyear)
from #datesTemp
group by monthandyear, sp
order by sp
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
select @colNames = STUFF((SELECT ', isnull(' + QUOTENAME(monthandyear)+', 0) as '+QUOTENAME(monthandyear)
from #datesTemp
group by monthandyear, sp
order by sp
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT resource, clientname,' + @colNames + '
from
(
select [CLIENTNAME], [RESOURCE], [FORECASTTOTAL],
REPLACE(SUBSTRING(CONVERT(varchar(11), SCHEDULEDDATE, 13), 4, 8), '' '', '''') monthandyear
from viewprojscheduling_group
) x
pivot
(
sum(FORECASTTOTAL)
for monthandyear in (' + @cols + ')
) p '
execute(@query)
देखें SQL Fiddle with Demo . यह प्रश्न आपको परिणाम देगा:
| RESOURCE | CLIENTNAME | JAN2013 | FEB2013 | MAR2013 | APR2013 | MAY2013 |
---------------------------------------------------------------------------
| res1 | abc | 1000 | 2000 | 0 | 0 | 0 |
| res1 | def | 0 | 0 | 2000 | 0 | 0 |
| res2 | def | 1500 | 0 | 0 | 0 | 0 |
| res3 | ghi | 0 | 0 | 2500 | 0 | 0 |