Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment créer un résumé en joignant une seule table avec SQL Server ?

En supposant que vous utilisez SQL Server 2005 ou supérieur, voici le code :

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 )

Cela fonctionnera quel que soit le nombre de statuts différents que vous avez. Il assemble dynamiquement une requête avec PIVOT .

Mettre à jour

Comme @JonH l'a souligné, il y avait une vulnérabilité dans le code que j'ai posté, ce qui a rendu possible une attaque par injection. Ceci est maintenant corrigé, en utilisant QUOTENAME lors de la formation des noms de colonnes.

Autres exemples :