sql >> Base de Datos >  >> RDS >> Sqlserver

Encabezados de columna generados dinámicamente en la consulta sql

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