Giả sử bạn đang sử dụng SQL Server 2005 trở lên, đây là mã:
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 )
Điều này sẽ hoạt động cho dù bạn có bao nhiêu trạng thái khác nhau. Nó tự động kết hợp một truy vấn với PIVOT
.
Cập nhật
Như @JonH đã chỉ ra, có một lỗ hổng trong mã mà tôi đã đăng, có thể xảy ra một cuộc tấn công tiêm. Điều này hiện đã được khắc phục bằng cách sử dụng QUOTENAME khi tạo tên cột.
Các ví dụ khác: