Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

En-têtes de colonnes générés dynamiquement dans une requête sql

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