Translate

quinta-feira, 27 de março de 2014

ACUMULAR VALORES DE UMA SOMA

Exemplo de uma query que realiza uma soma e acumula os valores somados em outra coluna ao lado.

select   equipe    
        ,vendedor
        ,sum(valor) valor
        ,SUM(SUM(valor)) OVER (ORDER BY equipe,vendedor ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS acumulado
  from   vendas
  group by equipe, vendedor
  order by 1,2;


    EQUIPE VENDEDOR VALOR ACUMULADO
1 1 Jose     16,49 16,49
2 1 Paulo    16,49 32,98
3 1 Pedro    25,79 58,77
4 1 Joao     62,33 121,1
5 1 Antonio  17,31 138,41
6 1 Felipe    8,01 146,42
7        1 Oscar    17,31 163,73
8        1 Lucio    42,65 206,38
9 1 Marcelo  51,65 258,03

19 comentários:

  1. Muito bom seu post . Me atendeu perfeitamente. Obrigado

    ResponderExcluir
  2. Bom dia, no caso se eu tiver 2 valores para o vendedor José 1 , exemplo: vendas em medicamentos e Vendas em matriais hospitalares, como eu faria a query?

    ResponderExcluir
    Respostas
    1. Bom dia,
      No exemplo acima, esta agrupando por equipe e vendedor, ou seja, eh a soma das vendas do Jose, pode ser que o valor de 16,49 do Jose esteja agrupando duas vendas de 8,24 por exemplo. Se vc tiver mais uma coluna, referente ao seu questionamento (ex: tipo de venda), basta vc inserir a coluna e alterar o agrupamento: ex:

      select equipe
      ,vendedor
      ,tipo_de_venda
      ,sum(valor) valor
      ,SUM(SUM(valor)) OVER (ORDER BY equipe,vendedor, tipo_de_venda ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS acumulado
      from vendas
      group by equipe, vendedor, tipo_de_venda
      order by 1,2;

      Obs: Nao consegui testar pois nao tenho mais esse modelo de dados. Perdao se nao for nao tiver entendido sua duvida.

      Excluir
  3. Suponhamos que a partir da linha 6, Felipe, Oscar, Lucio e Marcelo fossem da equipe = 2, teria como iniciar uma nova soma acumulada a partir da linha 6 ?

    ResponderExcluir
    Respostas
    1. Tem sim Edi !
      Antes da condicao original que esta na query acima, acrescenta essa aqui:
      ,SUM(SUM(valor)) OVER (PARTITION BY equipe ORDER BY equipe ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS acumulado_por_equipe

      Excluir
    2. cara você é muito bom cara parabéns

      Excluir
    3. Valeu Lucas, bondade sua ! Grande abraço !

      Excluir
  4. Tem como colocar condição sobre o acumulado?

    ResponderExcluir
    Respostas
    1. Creio que no acumulado nao pois ele eh somente uma soma da coluna "valor", linha a linha. O que vc pode fazer eh filtrar a coluna "valor", por exemplo, se vc quiser somar somente valores maiores que 50, vc coloca na clausula where "having sum(valor) > 50". Abracos

      Excluir
  5. Opa e como eu agrupo por exemplo, tendo o acumulado até tal valor .. e aí reseto acumulado?

    ResponderExcluir
  6. Maninho isso me ajudou muito esta de parabéns pelo Blog, já achei muitas dicas que me ajudaram.
    Só que tenho uma dúvida e ja pesquisei bastante e até agora não consegui resolver, quem sabe vc pode me ajudar:

    Quero fazer uma analise, tipo tenho dois meses de vendas de dois vendedores e quero ver o crescimento de cada um entre os meses, isso por vendedor quanto cada um cresceu no mês.

    Tem alguma dica sobre esse assunto?

    Desde já agradeço.

    ResponderExcluir
  7. Marcio seu blog esta de parabéns mano, me ajudou muito em vários relatórios na empresa.
    Porém tenho uma dúvida aqui que já é meio antiga, tenho feito varias pesquisas, mas não obtive o resultado que gostaria.
    a dúvida é:

    Quero fazer uma analise de crescimento, tipo tenho um vendedor, que vendeu X no mÊs 01 e o mesmo vendedor vendeu Y no mes 02, quero saber quanto ele cresceu nas vendas, e isso para um período maior.

    Desde já agradeço.



    ResponderExcluir
  8. Cara Parabéns!
    estava desde as 12:00 quebrando a cabeça tentando utilizar o LEAD() E LAG() e não dava certo! Sua solução salvou minha sexta!!! Valew mesmo!

    ResponderExcluir
  9. Conteúdo prático e funcional ! Parabéns, me ajudou d+. Abraço

    ResponderExcluir