Vi este problema de pivote dinámico en diferentes ocasiones. Y lo tuve que hacer. Después de buscar mucho, llegué a una solución que funciona muy bien para mí. no es tan elegante pero me salvó. Lo que hago es primero preparar los datos en una tabla temporal, luego creo dinámicamente la cadena pivote (en su caso es DD-MM) asignándola a una variable. Y al final construyo una cadena sql para ejecutar como sql dinámico .
Usé sus datos de muestra y parece funcionar. Espero que esto ayude
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