--Create table
CREATE Table dbo.MyTable
(
idenddate datetime
);
GO
--Insert sample record in table
Insert into dbo.MyTable select getdate()
Go
Insert into dbo.MyTable select Dateadd(d,1,getdate())
Go
Insert into dbo.MyTable select Dateadd(d,2,getdate())
Go
Insert into dbo.MyTable select Dateadd(d,3,getdate())
Go
Insert into dbo.MyTable select Dateadd(d,4,getdate())
Go
Insert into dbo.MyTable select Dateadd(d,5,getdate())
Go
Insert into dbo.MyTable select Dateadd(d,6,getdate())
Go
Insert into dbo.MyTable select Dateadd(d,7,getdate())
Go
Insert into dbo.MyTable select Dateadd(d,12,getdate())
Go
--Optimize query
DECLARE @cols AS NVARCHAR(MAX),@colsHeader AS NVARCHAR(MAX), @query AS NVARCHAR(MAX)
--Create Column
select @cols = STUFF((SELECT ',' + 'W' + CONVERT(varchar(2), DATEPART(WEEK,idenddate))
from dbo.MyTable
Group by DATEPART(WEEK,idenddate)
order by DATEPART(WEEK,idenddate)
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
--Create Column Header
select @colsHeader = STUFF((SELECT ',' + 'W' + CONVERT(varchar(2), DATEPART(WEEK,idenddate)) + ' ''' + CONVERT(varchar(2), DATEPART(WEEK,idenddate)) +''''
from dbo.MyTable
Group by DATEPART(WEEK,idenddate)
order by DATEPART(WEEK,idenddate)
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT ' + @colsHeader + ' from
(
SELECT ''W''+ Convert(varchar(2), DATEPART(WEEK,idenddate)) AS WeekNumber,
COUNT (*) as Total
FROM dbo.MyTable
Group by DATEPART(WEEK,idenddate)
) x
pivot
(
sum(Total)
for WeekNumber in (' + @cols + ')
) p '
EXEC(@query)