Criando uma soma cumulativa com o banco SQL utilizando apenas uma Consulta.

Para criar um somatório acumulado de um campo da tabela, pode-se configurar uma Consulta utilizando o comando Inner Join do SQL.

Exemplo:

Data/Hora Campo Acumulado
20/02/2014 09:54:05 1 1
20/02/2014 09:54:15 3 4
20/02/2014 09:54:35 5 9
20/02/2014 10:03:58 1 10

Para calcular este valor acumulado, é preciso definir duas variáveis para a mesma tabela: uma para os campos da tabela e outra para o somatório. Por mais que ambas as variáveis façam referência à mesma tabela, o SQL as trata como se fossem duas tabelas diferentes.

No SQL exemplo abaixo, foram definidas as variáveis t1 para os campos e t2 para o somatório.

SELECT t1.E3TimeStamp,t1.Campo, SUM(T2.Campo) as Soma
FROM Somatorio AS t1
INNER JOIN Somatorio AS t2 on t1.E3TimeStamp >= t2.E3TimeStamp
GROUP BY  t1.E3TimeStamp,t1.Campo
ORDER BY t1.E3TimeStamp  ASC

A função Inner Join une as duas tabelas para que o somatório apareça junto aos registros da tabela principal.

Anexos:

ProjetoSomatorio.rar

Print Friendly, PDF & Email

Este artigo foi útil? Was this helpful?

Classificação média - Average rating 4.3 / 5. Count: 7

Thoughts on “Criando uma soma cumulativa com o banco SQL utilizando apenas uma Consulta.

  1. E se eu quiser somar o campo do E3TimeStamp,. Por exemplo, quero somar o tempo em min e segundos da Coluna E3TimeStamp é possível ? ou o tratamento dos dados são diferentes?

    1. Olá Gustavo,
      Pode sim, porém não é utilizado a função SUM() sozinha.
      A depender da versão e tipo do banco, pode-se utilizar funções como DateAdd(), Convert(), Int()…
      Abaixo segue algumas possibilidades:
      Google | SQL Somar Coluna DateTime

  2. Ola eu tenho uma tabela que mostra extrato de ligações de um cliente. Até 100 minutos n pode cobrar nada após os 100 minutos tem que cobrar 15 centavos por minuto. Queria ver uma forma de ele pegar as ligações e joga valor 0 nas ligações até 100 minutos e jogar o valor de 15 assim q passar os 100 minutos.

    1. Se você precisa apenas inserir o valor 0 na coluna que possui valores até 100, e 15 (ou 0.15) nos demais registros, uma sugestão seria a seguinte:

      Access:
      SELECT t1.E3TimeStamp,t1.Campo, SUM(T2.Campo) as Soma, IIf(SUM(T2.Campo) > 100, 0.15, 0) as Valor
      FROM Somatorio AS t1
      INNER JOIN Somatorio AS t2 on t1.E3TimeStamp >= t2.E3TimeStamp
      GROUP BY t1.E3TimeStamp,t1.Campo
      ORDER BY t1.E3TimeStamp ASC

      SQL:
      SELECT SUM(T2.Campo), CASE WHEN (SUM(T2.Campo)) > 100 THEN 0.15 ELSE 0 END
      FROM Nivel AS t1
      INNER JOIN Nivel AS t2 on t1.E3TimeStamp >= t2.E3TimeStamp
      GROUP BY t1.E3TimeStamp,t1.Campo
      ORDER BY t1.E3TimeStamp ASC

  3. Na minha tabela, eu tenho uma condição, se for FALSO, eu preciso reiniciar a contagem, tentei fazer com o case when, mas não deu muito certo.

  4. bom dia a todos!
    tenho uma consulta que atualizada diariamente e eu gostaria de salvar o total de linhas e a data diariamente deste consulta como faria isto?

  5. É possível obter o mesmo resultado de maneira mais simples, sem usar um JOIN na própria tabela.
    Pode ser usada a função SUM() com OVER(), conforme abaixo…

    SELECT E3TimeStamp, Campo,
    SUM(Campo) OVER(ORDER BY E3TimeStamp ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS Acumulado
    FROM Somatorio;

    Repare que este SUM não é uma operação de agrupamento, não necessita de GROUP BY.

    1. MARIO, excelente, me ajudou muito na elaboração de um relatório de curva ABC de produtos !
      DANIEL, muito bom ter compartilhado e motivado as contribuições. Obrigado a vocês !!

  6. boa tarde! no meu caso eu preciso acumular no mês tudo que estiver nos meses posteriores. por exemplo, em janeiro eu sumo o valor do resultado de janeiro + fev, mar, abr, mai…. separando pelas UFS de RJ e SP. meus campos são UF, MES, VALOR. teria alguma forma de fazer isso? tentei com seu conteúdo e até mesmo com algumas dicas aqui dos comentários, mas não foi.

    1. Felipe,

      Tem que acrescentar um filtro para o campo UF. Por exemplo:

      WHERE T1.UF = ‘RJ’

      Esse filtro pode conter uma variável ('<%Var%>') cujo valor você pode atribuir por script com o método SetVariableValue antes de executar a Consulta. Por exemplo:

      query.SetVariableValue “Var”, “RJ”

    2. Paulo, talvez eu não consegui expressar o problema para sua melhor interpretação. o ponto é, que eu teria que somar o valor do mês atual + os meses subsequentes. ex. Jan: 10, Fev 25, Mar: 30, Abr: 15. Então a minha soma acumulada deveria ser: Jan: 80, Fev: 70, Mar: 45….

  7. Apliquei o codigo com uma consulta UNION em tabelas nao relacionadas. Gostaria de acrescentar a descriçao correspondente ao valor.
    como acrescento no codigo outro camp ?
    quando coloco Select Descricao,…
    vem mensage que descricao pode se referir a masi de uma tabela relacionada na clausula from

  8. Boa tarde, estou tentando fazer uma query onde agrupo por uma coluna(comprador), onde tenho que pegar cada linha de uma coluna(valor) e somar tudo que é maior que aquela linha que esta naquele grupo da linha(calculo) senão manter o valor da linha no calculo. E fazer para a linhas posteriores. Exemplo: primeira linha Grupo comprador A so tem A manter no calculo o valor 3 no calculo. Linha 2 grupo B olhar tudo que é maior que 4 no grupo B e soma da 22, linha 3 tudo que é maior que 2 deu 26 e sucessivamente.
    linha comprador valor calculo
    1 A 3 3
    2 B 4 22
    3 B 2 26
    4 B 5 17
    5 B 7 10
    6 B 10 10
    7 C 20 21
    8 C 21 21
    Queria uma ideia para fazer isso, não achei nada para verificar linha a linha e somar o que é maior.

  9. Eu precisava criar um série histórica por dia com a soma acumulada dos últimos 30 dias, e esse range de 30 dias ir acompanhando a minha data. Por exemplo dis 30/1 tem que ter a soma de 01/01 até 30/01, no dia 01/02 tem que ter a soma acumulada de 02/01 até 01/02.

Leave a Reply

Your email address will not be published.Required fields are marked *