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