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.
top
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?
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
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.
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
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.
Felipe, sugiro que procure um suporte técnico especializado em SQL ou um forum mais específico sobre o assunto.
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?
É 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.
Muito boa a sua colaboração, Mario.
Só uma observação, esse código não irá funcionar com o Access (MDB).
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 !!
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.
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”
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….
Felipe,
Aí é justamente o que está explicado no artigo. Basta seguir o exemplo. Se mesmo assim não funcionar, mande o log do E3 para pgustavo@elipse.com.br.
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
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.
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.
Quero somar o preço vezes quantidade de dois mil itens com quantidade diferentes