यदि आप अपने मानदंडों को पूरा करने वाला डेटा प्राप्त करने के लिए किसी भी दिनांक मान में पास होने में सक्षम होना चाहते हैं, तो इस प्रकार के PIVOT
के लिए आपको इसके समान एक गतिशील SQL समाधान का उपयोग करने की आवश्यकता होगी:
DECLARE @cols AS NVARCHAR(MAX),
@colsRollup AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX),
@StartDate DateTime,
@EndDate DateTime
Set @StartDate = '10-08-2012 00:00:00.000'
Set @EndDate = '11-18-2012 23:59:59.000'
select @cols = STUFF((SELECT ',' + QUOTENAME(WeekEnd)
from
(
select DatePart(wk, I01.[SPGI01_CREATE_S]) WeekEnd
from [SUPER-G].[dbo].[CSPGI01_ASN_ACCURACY]
where I01.[SPGI01_CREATE_S] between @StartDate AND @EndDate
) src
group by WeekEnd
order by WeekEnd desc
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
select @colsRollup = STUFF((SELECT ', Sum(' + QUOTENAME(WeekEnd) +') as WeekNo'+Cast(Weekend as varchar(2))
from
(
select DatePart(wk, I01.[SPGI01_CREATE_S]) WeekEnd
from [SUPER-G].[dbo].[CSPGI01_ASN_ACCURACY]
where I01.[SPGI01_CREATE_S] between @StartDate AND @EndDate
) src
group by WeekEnd
order by WeekEnd desc
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = '
SELECT case when InstanceType is not null then InstanceType else ''Sum'' End InstanceType ,
'[email protected]+', max(InstanceDescription) AS InstanceDescription
FROM
(
SELECT SPGI01_INSTANCE_TYPE_C as InstanceType,
InstanceDescription, ' + @cols + '
from
(
SELECT I01.[SPGI01_INSTANCE_TYPE_C],
DatePart(wk, I01.[SPGI01_CREATE_S]) WeekNo,
DATEADD(DAY, 7 -DATEPART(WEEKDAY,I01.[SPGI01_CREATE_S]), I01.[SPGI01_CREATE_S]) WeekEnd,
J03.SPGJ03_MSG_TRANSLN_X InstanceDescription
FROM [SUPER-G].[dbo].[CSPGI01_ASN_ACCURACY] I01
INNER JOIN [SUPER-G].[dbo].[CSPGI50_VALID_INSTANCE_TYPE] I50
ON I50.[SPGI50_INSTANCE_TYPE_C] = I01.[SPGI01_INSTANCE_TYPE_C]
LEFT JOIN CSPGJ02_MSG_OBJ J02
ON I50.SPGJ02_MSG_K = J02.SPGJ02_MSG_K
LEFT JOIN CSPGJ03_MSG_TRANSLN J03
ON J02.SPGJ02_MSG_K = J03.SPGJ02_MSG_K
where I50.[SPGA04_RATING_ELEMENT_D] = 1
and I01.[SPGI01_EXCEPTIONED_F] = ''N''
and I01.[SPGI01_DISPUTED_F] != ''Y''
AND J03.[SPGJ03_LOCALE_C] = ''en_US''
and I01.[SPGA02_BUSINESS_TYPE_C] = ''PROD''
and I01.[SPGA03_REGION_C] = ''EU''
and I01.[SPGI01_SUB_BUSINESS_TYPE_C] = ''PRD''
and I01.[SPGI01_CREATE_S] between '+ convert(varchar(10), @StartDate, 120)+' AND '+ convert(varchar(10), @EndDate, 120)+'
) x
pivot
(
count(WeekEnd)
for weekno in (' + @cols + ')
) p
) x1
GROUP BY InstanceType WITH ROLLUP '
execute(@query)
नोट:यह परीक्षण नहीं किया गया है क्योंकि मेरे पास कोई नमूना डेटा आदि नहीं है।