sql >> Databasteknik >  >> RDS >> Sqlserver

Hur skapar jag en sammanfattning genom att ansluta till en enda tabell med SQL Server?

Förutsatt att du använder SQL Server 2005 eller senare, här är koden:

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 )

Detta kommer att fungera oavsett hur många olika status du har. Den sammanställer dynamiskt en fråga med PIVOT .

Uppdatera

Som @JonH påpekade fanns det en sårbarhet i koden jag postade, vilket möjliggjorde en injektionsattack. Detta är nu åtgärdat genom att använda QUOTENAME när kolumnnamnen bildas.

Andra exempel:



  1. ResultSet#getDate() semantik

  2. Databas:En tabell för varje språk eller en tabell med en språkkolumn

  3. Returnera partitionsnumret för varje rad när du frågar efter en partitionerad tabell i SQL Server (T-SQL)

  4. Återställ sekvens i oracle 11g