Виждал съм този проблем с динамично въртене различни пъти. И трябваше да го направя. След много търсене стигнах до решение, което работи чудесно за мен. не е толкова елегантно, но ме спаси. Това, което правя, е първо да подготвя данните във временна таблица, след което динамично създавам обобщения низ (във вашия случай това е DD-MM), като го присвоявам на променлива. И накрая конструирам sql низ, който да се изпълни като динамичен sql .
Използвах вашите примерни данни и изглежда, че работи. Надявам се това да помогне
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