none
Dúvidas com o PIVOT RRS feed

  • 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
    terça-feira, 1 de março de 2016 18:24

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

    terça-feira, 1 de março de 2016 21:02
  • 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



    terça-feira, 1 de março de 2016 21:20
  • 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

    terça-feira, 1 de março de 2016 21:41
  • 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

    quarta-feira, 2 de março de 2016 14:46