none
Agrupamento e Somatoria RRS feed

  • Pergunta

  • Bom dia

    Por favor, estou fazendo uma query  com o objetivo de mostrar a quantidade de produto solicitado no pedido de venda por mês 

    SELECT T11.ItemCode,T11.Dscription,

    Janeiro = CASE MONTH (t22.DocDueDate)
    when 01 then SUM (convert(numeric,T11.QUANTITY))
    end

    ,Fevereiro = CASE MONTH (t22.DocDueDate)
    when 02 then SUM (convert(numeric,T11.QUANTITY))
    end

    ,Março = CASE MONTH (t22.DocDueDate)
    when 03 then SUM (convert(numeric,T11.QUANTITY))
    end

    ,Abril = CASE MONTH (t22.DocDueDate)
    when 04 then SUM (convert(numeric,T11.QUANTITY))
    end

    ,Maio = CASE MONTH (t22.DocDueDate)
    when 06 then SUM (convert(numeric,T11.QUANTITY))
    end

      FROM RDR1 T11

    INNER JOIN ORDR T22 ON T11.DocEntry=T22.DocEntry
    AND T22.DocStatus <>'C'

    WHERE T22.DocDueDate BETWEEN '20170101' AND '20171231'

    GROUP BY T11.ItemCode,T11.Dscription,t22.DocDueDate

    o Resultado está sendo esse , os item repetem, é para agrupar ,e na coluna do mes somar

    O esperado assim.

    Obrigado

    sexta-feira, 3 de fevereiro de 2017 10:58

Respostas

  • Boa tarde,

    Fico feliz em ter ajudado.

    Quanto a lógica: Quando você coloca o Case dentro do SUM, você está somando o retorno desse case (Que nesse caso só poderá ser um valor nulo ou o valor do campo T11.QUANTITY). Por outro lado, quando você coloca o Sum dentro do Case, você estará somando somente o valor do Then (Nesse caso, o valor da coluna T11.QUANTITY), dessa forma, é como se o(s) campo(s) especificado(s) no When fosse mais uma coluna especificada no select. Resumindo, é como se você isso:

    Case dentro do SUM:

    Select SUM(Valor da coluna T11.QUANTITY onde o mês (DocDueDate) for igual  3)

     

    Sum dentro do CASE:

    Select DocDueDate, Sum(T11.QUANTITY) Where o mês (DocDueDate) for igual  3 (Por isso você é obrigado a agrupar nesse caso).

    sexta-feira, 3 de fevereiro de 2017 16:04

Todas as Respostas

  • Bom dia, Paranhas!

    Tenta tirar o campo t22.DocDueDate do group by, e subistituir os cases de:

    Maio = CASE MONTH (t22.DocDueDate) when 06 then SUM (convert(numeric,T11.QUANTITY)) end

    Para:

    Maio = SUM (convert(numeric, CASE MONTH (t22.DocDueDate) when 06 then T11.QUANTITY end)



    sexta-feira, 3 de fevereiro de 2017 11:06
  • Deleted
    sexta-feira, 3 de fevereiro de 2017 11:45
  • Bom dia,

    Paranhas, para esse tipo de você também pode utilizar Pivot. Segue uma sugestão para testes:

    select
        ItemCode,
        Dscription,
        [1] as Janeiro,
        [2] as Fevereiro,
        [3] as Marco,
        [4] as Abril,
        [5] as Maio
    from
    (
        SELECT 
            T11.ItemCode, 
            T11.Dscription, 
            MONTH(t22.DocDueDate) as Mes, 
            convert(numeric, T11.QUANTITY) as Quantity
        FROM ORDR T22
        INNER JOIN RDR1 T11 ON T11.DocEntry = T22.DocEntry
        WHERE 
            T22.DocStatus <> 'C' AND
            T22.DocDueDate BETWEEN '20170101' AND '20170531'
    ) as t
    pivot
    (
        sum(Quantity) for Mes in ([1], [2], [3], [4], [5])
    ) as p

    Espero que seja útil


    Assinatura: http://www.imoveisemexposicao.com.br

    sexta-feira, 3 de fevereiro de 2017 12:33
  • Boa tarde

    Mailson

    Muito Obrigado, funcionou muito bem, Não entendi a logica da alteração case.

    Muito Obrigado

    Reinaldo

    sexta-feira, 3 de fevereiro de 2017 15:38
  • Boa tarde

    Obrigado, José 

    estou convertendo pois esse valor é de quantidade "UN" de caixa é no sql em com o padrão americano.

    Obrigado

    sexta-feira, 3 de fevereiro de 2017 15:40
  • Boa tarde,

    Por gentileza, lembre-se de marcar como resposta aquela que te ajudou.

    Atenciosamente,


    Robson William Silva

    Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    sexta-feira, 3 de fevereiro de 2017 15:48
  • Boa tarde,

    Fico feliz em ter ajudado.

    Quanto a lógica: Quando você coloca o Case dentro do SUM, você está somando o retorno desse case (Que nesse caso só poderá ser um valor nulo ou o valor do campo T11.QUANTITY). Por outro lado, quando você coloca o Sum dentro do Case, você estará somando somente o valor do Then (Nesse caso, o valor da coluna T11.QUANTITY), dessa forma, é como se o(s) campo(s) especificado(s) no When fosse mais uma coluna especificada no select. Resumindo, é como se você isso:

    Case dentro do SUM:

    Select SUM(Valor da coluna T11.QUANTITY onde o mês (DocDueDate) for igual  3)

     

    Sum dentro do CASE:

    Select DocDueDate, Sum(T11.QUANTITY) Where o mês (DocDueDate) for igual  3 (Por isso você é obrigado a agrupar nesse caso).

    sexta-feira, 3 de fevereiro de 2017 16:04
  • Deleted
    domingo, 5 de fevereiro de 2017 15:20