Ik heb dit dynamische spilprobleem verschillende keren gezien. En ik moest het. Na veel zoeken kwam ik tot een oplossing die voor mij prima werkt. het is niet zo elegant, maar het heeft me gered. Wat ik doe is eerst de gegevens voorbereiden in een tijdelijke tabel, daarna maak ik dynamisch de pivot-string (in jouw geval is het DD-MM) en wijs deze toe aan een variabele. En uiteindelijk bouw ik een sql-string om uit te voeren als dynamische sql .
Ik heb uw voorbeeldgegevens gebruikt en het lijkt te werken. Ik hoop dat dit helpt
select
userid,
browsername,
CAST(day(logintime) as nvarchar(2)) + '-' + CAST(Month(logintime) AS nVARCHAR(2)) AS period
INTO #TMP
from user_log_table order by 1
DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ','
+ QUOTENAME(convert(varchar(10), period, 120))
from #TMP order by 1
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT userid, browsername,' + @cols + ' from
(
select userid, browsername, period
from #TMP
) x
pivot
(
count(period)
for period in (' + @cols + ')
) p '
exec(@query)
drop table #TMP