Inquiridor
Dúvidas com o PIVOT

Discussão Geral
-
Pessoal, estou desenvolvendo um pivot para ajudar no capacity de alguns bancos de dados.
Só que parei em uma questão, (CONVERT(numeric(10, 1), sum(rs.SPACE_USED_DATAFILE)) AS avgmega)
preciso somar e agrupar por base de dados e pegar o maior valor dentro de um mês.
O problema da query abaixo é que está somando todos os valores por base de dados dentro do mês, não sei se o rank over me ajudaria.
Alguém tem alguma ideia ?
declare @data datetime
set @data = GetDate()
SELECT
pv.Database_name AS NOME,
pv.[-12],
pv.[-11],
pv.[-10],
pv.[-9],
pv.[-8],
pv.[-7],
pv.[-6],
pv.[-5],
pv.[-4],
pv.[-3],
pv.[-2],
pv.[-1],
pv.[0]
FROM
(SELECT rs.NAME AS Database_name
,DATEDIFF(MM, @data, rs.data) AS mes
, CONVERT(numeric(10, 1), sum(rs.SPACE_USED_DATAFILE)) AS avgmega
FROM dbo.resultv2 as rs
where rs.data BETWEEN DATEADD(YY, -1, @data) AND @data
and rs.TIPO <> 'LOG'
GROUP BY rs.NAME
,DATEDIFF(mm, @data, rs.data)
) AS btt
PIVOT (SUM(btt.avgmega)
FOR btt.mes IN ([0], [-1], [-2], [-3], [-4], [-5], [-6], [-7], [-8], [-9], [-10], [-11], [-12])
) AS pv
ORDER BY Database_name
Vinícius Kleber
- Editado Vinícius Matias terça-feira, 1 de março de 2016 18:25
- Tipo Alterado Marcos SJ terça-feira, 1 de março de 2016 20:04 How to
Todas as Respostas
-
Boa tarde,
Não sei se entendi corretamente, mas experimente alterar o Sum que está dentro do Pivot por Max.
PIVOT (MAX(btt.avgmega) -- ...
Espero que ajude
Assinatura: http://www.imoveisemexposicao.com.br
-
Fala gapimex, então... já alterei e não funcionou.
deixa eu tentar explicar melhor...
no campo (rs.SPACE_USED_DATAFILE) são os dados que eu coleto diariamente, poré eu realizo um datediff pegando o mês e fazendo o bettwen durante um ano BETWEEN DATEADD(YY, -1, @data) AND @data.
Na minha função e agregação, ele precisa pegar somente um valor do mês, mas o que ele está fazendo é somando o mes todo.
Por exemplo, se eu coleto o tamanho da minha base durante 1 mes, ele sempre gravar 1, no final do mês terei o valor 30. E não é para pegar o valor 30 e sim o valor 1.
Não sei se fui claro, por exemplo, se eu dividir o valor sum(rs.SPACE_USED_DATAFILE) / 30) AS avgmega ele chega o valor que eu quero, porém se minha coleta ainda estiver no dia 15 terei problemas para
chegar no valor correto.
Não sei se deu para entender direito.Os valores em azul estão corretos, os em vermelhos estão errados, pq estão somando o valor por base durante o mês.
Vinícius Kleber
- Editado Vinícius Matias terça-feira, 1 de março de 2016 21:26
-
Experimente fazer um teste retirando o Sum para ver se é obtido o resultado esperado:
FROM (SELECT rs.NAME AS Database_name ,DATEDIFF(MM, @data, rs.data) AS mes , CONVERT(numeric(10, 1), rs.SPACE_USED_DATAFILE) AS avgmega FROM dbo.resultv2 as rs where rs.data BETWEEN DATEADD(YY, -1, @data) AND @data and rs.TIPO <> 'LOG' ) AS btt PIVOT (MAX(btt.avgmega) FOR btt.mes IN ([0], [-1], [-2], [-3], [-4], [-5], [-6], [-7], [-8], [-9], [-10], [-11], [-12]) ) AS pv
Espero que ajude
Assinatura: http://www.imoveisemexposicao.com.br
-
gapmix, obrigado pela ajuda...
tive que mudar um pouco a logica, ficou assim...
declare @data datetime
set @data = GetDate()
;
With DadosDia As
(
Select
rs.NAME AS Database_name
,Month(rs.data) AS mes
,CONVERT(numeric(10, 1),sum(rs.SPACE_USED_DATAFILE)) AS avgmega
FROM dbo.resultv2 as rs Where rs.data BETWEEN DATEADD(YY, -1, @data) AND @data and rs.TIPO <> 'LOG'
GROUP BY rs.NAME ,Month(rs.data) ,Day(rs.data)
)
SELECT
Database_name,
[1] AS JANEIRO,
[2] AS FEVEREIRO,
[3] AS MARÇO,
[4] AS ABRIL,
[5] AS MAIO,
[6] AS JUNHO,
[7] AS JULHO,
[8] AS AGOSTO,
[9] AS SETEMBRO,
[10] AS OUTUBRO,
[11] AS NOVEMBRO,
[12] AS DEZEMBRO
FROM DadosDia
PIVOT (max(DadosDia.avgmega)
FOR DadosDia.mes IN ([1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12])
) AS PV
ORDER BY Database_name
end
Vinícius Kleber