Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Dynamisch generierte Spaltenüberschriften in SQL-Abfragen

Ich habe dieses dynamische Pivot-Problem zu verschiedenen Zeiten gesehen. Und ich musste es. Nach langem Suchen bin ich auf eine Lösung gestoßen, die bei mir super funktioniert. es ist nicht so elegant, aber es hat mich gerettet. Zuerst bereite ich die Daten in einer temporären Tabelle vor, danach erstelle ich dynamisch die Pivot-Zeichenfolge (in Ihrem Fall ist es DD-MM), indem ich sie einer Variablen zuweise. Und am Ende konstruiere ich eine SQL-Zeichenfolge, die als dynamisches SQL ausgeführt wird .

Ich habe Ihre Beispieldaten verwendet und es scheint zu funktionieren. Hoffe das hilft

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