Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come si crea un riepilogo unendosi a una singola tabella con SQL Server?

Supponendo che tu stia utilizzando SQL Server 2005 o versioni successive, ecco il codice:

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 )

Funzionerà indipendentemente dal numero di stati diversi che hai. Assembla dinamicamente una query con PIVOT .

Aggiorna

Come ha sottolineato @JonH, c'era una vulnerabilità nel codice che ho pubblicato, che ha reso possibile un attacco injection. Il problema è stato risolto utilizzando QUOTENAME quando si formano i nomi delle colonne.

Altri esempi: