sql >> Database >  >> RDS >> Sqlserver

Hoe bouw ik een samenvatting door deel te nemen aan een enkele tabel met SQL Server?

Ervan uitgaande dat u SQL Server 2005 of hoger gebruikt, is hier de 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 )

Dit werkt ongeacht hoeveel verschillende statussen je hebt. Het stelt dynamisch een query samen met PIVOT .

Bijwerken

Zoals @JonH opmerkte, zat er een kwetsbaarheid in de code die ik plaatste, waardoor een injectie-aanval mogelijk werd. Dit is nu opgelost door QUOTENAME te gebruiken bij het vormen van de kolomnamen.

Andere voorbeelden:



  1. Datums, tijden en intervallen weergeven in PostgreSQL

  2. Foutmelding Unterminated string letterlijke

  3. Hoe vind ik Unicode/niet-ASCII-tekens in een NTEXT-veld in een SQL Server 2005-tabel?

  4. Bestandstypen toevoegen die moeten worden herkend door Files.probeContentType(new File(.ttf).toPath());