Suponiendo que está utilizando SQL Server 2005 o superior, aquí está el código:
DECLARE @cols VARCHAR(1000)
DECLARE @sqlquery VARCHAR(2000)
SELECT @cols = STUFF(( SELECT distinct ',' + QuoteName(cast([status] as varchar))
FROM LogTable FOR XML PATH('') ), 1, 1, '')
SET @sqlquery = 'SELECT * FROM
(SELECT UserIndex, [status]
FROM LogTable ) base
PIVOT (Count(status) FOR [status]
IN (' + @cols + ')) AS finalpivot'
EXECUTE ( @sqlquery )
Esto funcionará sin importar cuántos estados diferentes tengas. Ensambla dinámicamente una consulta con PIVOT
.
Actualizar
Como señaló @JonH, había una vulnerabilidad en el código que publiqué, lo que hizo posible un ataque de inyección. Esto ahora está solucionado usando QUOTENAME al formar los nombres de las columnas.
Otros ejemplos: