J'ai vu ce problème de pivot dynamique à plusieurs reprises. Et je l'ai eu. Après avoir beaucoup cherché, je suis arrivé à une solution qui me convient parfaitement. ce n'est pas si élégant mais ça m'a sauvé. Ce que je fais est d'abord de préparer les données dans une table temporaire, après cela, je crée dynamiquement la chaîne pivot (dans votre cas, c'est DD-MM) en l'attribuant à une variable.Et à la fin, je construis une chaîne sql à exécuter en tant que sql dynamique .
J'ai utilisé vos exemples de données et cela semble fonctionner. J'espère que cela vous aidera
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