SQL Server 2008 R2
Estatísticas PIVOT IO
Eu tenho um script que coleta estatísticas de IO de sys.dm_io_virtual_file_stats uma vez por dia e as armazena em uma tabela. Eu quero poder usar essas estatísticas para gerar gráficos.
Usando o PIVOT, criei colunas com base nas datas em que as estatísticas foram coletadas
select 'read io stall',[2012-10-17], [2012-10-18], [2012-10-19], [2012-10-20], [2012-10-21]
from (
select io_stall_read_ms, date_snap
from dbo.tbl_io_stats
where database_name = 'mydb'
) up
PIVOT (max(io_stall_read_ms) FOR date_snap IN ([2012-10-17], [2012-10-18], [2012-10-19], [2012-10-20], [2012-10-21]))
AS pvt
UNION
select 'write io stall', [2012-10-17], [2012-10-18], [2012-10-19], [2012-10-20], [2012-10-21]
from (
select database_name, io_stall_write_ms, date_snap
from dbo.tbl_io_stats
where database_name = 'mydb'
) up
PIVOT (max(io_stall_write_ms) FOR date_snap IN ([2012-10-17], [2012-10-18], [2012-10-19], [2012-10-20], [2012-10-21]))
AS pvt
Tabela resultante:
Type Stat 2012-10-17 2012-10-18 2012-10-19 2012-10-20 2012-10-21
read io stall 34449971 34499918 34504701 40383037 40852412
write io stall 20948385 20996323 21001665 24130053 24193110
Como está, tenho que adicionar cada nova data como uma coluna adicional.
Pergunta:
É possível gerar a lista de colunas PIVOT automaticamente ou existe outra maneira de fazer o que estou pensando?
Ao invés de
FOR date_snap IN ([2012-10-17], [2012-10-18], [2012-10-19], [2012-10-20], [2012-10-21]
Algo como:
FOR date_snap IN (SELECT DISTINCT date_snap FROM tbl_io_stats)
Atualize com a resposta de RichardTheKiwi
Aqui está a nova consulta de trabalho, obrigado RichardTheKiwi
DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX);
SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(ios.date_snap)
FROM tbl_io_stats ios
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT database_name + '' read io stall'', ' + @cols + ' from
(
select database_name, io_stall_read_ms, date_snap
from dbo.tbl_io_stats
where database_name = ''mydb''
) x
pivot
(
max(io_stall_read_ms)
for date_snap in (' + @cols + ')
) p
union
SELECT database_name + '' write io stall'', ' + @cols + ' from
(
select database_name, io_stall_write_ms, date_snap
from dbo.tbl_io_stats
where database_name = ''mydb''
) x
pivot
(
max(io_stall_write_ms)
for date_snap in (' + @cols + ')
) p '
--print @query
execute(@query)
O Oracle tem esse recurso (colunas dinâmicas da subconsulta), mas não o SQL Server. O melhor que você pode fazer é SQL dinâmico para gerar a instrução PIVOT, por exemplo, SQL Server dynamic PIVOT query .