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

Este artigo foi útil? Was this post helpful?
Yes16
No33

Comentários em “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?

  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.

  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

Deixe seu Comentário

Seu endereço de e-mail não será publicado. Campos marcados com asterisco são obrigatórios *