Somatoria em MySQL ?

13 respostas Resolvido
mysql
D

Eu tenho uma tabela com um relatório de várias maquinas. Essas máquinas tem um contador dentro, é como se fosse uma maquina que recebe dinheiro. assim que entra uma nota, aumenta o contador.

Fiz um robo que lê o status da maquina e pega o valor atual que ela tem, mas, lá só tem o valor atual. e eu vou juntando em uma tabela a parte como um histórico. Preciso criar um relatório e estou fazendo com IReport. Peguei todos os valores tudo, até ai tudo certo (ok).

Mas eu preciso que, quando mostre o valor, mostre quanto que entrou de dinheiro naquele momento. Logo, preciso mostrar somente o incremental. Como eu poderia fazer isso?

Exemplo: dia 1 entrou 100,00 na maquina. dia 2 entrou 150.

Mas o robô só vai colocar no banco de dados:

dia 1 status 100,00
dia 2 status 150,00

No relatório não pode ser dia 2 ENTROU 150,00. tem que aparecer que, no dia 2, entrou 50,00, não sei se fui claro.

13 Respostas

D
  1. Dê exemplos de sua tabela?
  2. As gravações e depois as pesquisas como os resultados devem sair?
D

Na minha tabela tem esses campos:

id | idMaquina | data | valor dentro da maquina

só vai incrementando esse contador, exemplo:

1 | 1 | 01/01/2016 | 50,00 //primeiro registro da maquina 1 com 50,00 inicial
2 | 2 | 01/01/2016 | 10,00 //primeiro registro da maquina 2 com 10,00 inicial
3 | 1 | 02/01/2016 | 60,00 //segundo registro da maquina 1 com 60,00 logo, entrou 10,00

fazer isso no java seria traquilo.

A treta é falar que… dia 02/01/2016, entrou 10,00 na maquina USANDO SQL.. Não faço a menor idéia de como eu poderia fazer isso.

S

Faça assim:

SELECT idMaquina,data,SUM(valor_das_notas) FROM tabela GROUP BY idMaquina,data;

D

isso me retornaria a somatoria correto?

nao entrou 60,00 no dia 2… entrou 10,00.

editei o nome da coluna pra ficar melhor pra entender.

S

Isso, ele soma e agrupa a somatória que entrou por máquina por dia.

D

eu nao tenho controle de quanto entrou…

o robo só ve o estado atual.

eu preciso infomar quanto entrou.

no dia 2… nao entoru 60 reais, entrou 10.

D
Solucao aceita

DEMO

SELECT a.id, a.idMaquina, a.data, a.valor,        
abs((select min(c.valor) from table3 c where a.idMaquina = c.idMaquina group by c.idMaquina limit 1) - valor) valor_entrada
FROM table3 a
GROUP BY data, idMaquina
ORDER BY idMaquina, data

DEMO

D

Cara, exatamente isso!!!, mas como isso era só um exemplo do problema que eu tenho. Você pode me explicar oque seria esses a. e ABS ?

D
  • ABS, retornar o valor absoluto, no caso ele retornar negativo então para tirar o negativo eu mando ele executar essa função.

mysql> SELECT ABS(2);
        -> 2
mysql> SELECT ABS(-32);
        -> 32
  • “a,” é um apelido ou alias renomeando table3 para a..
D

legal, entendi.

agora eu faço essa sql para vir aquele resultado

select * from counters_history order by date ASC

dai ele vem os dados como por ex. a coluna C1 E A C2.

c1 é coin in. e a c2 é coin out.

preciso fazer essa magica de pegar o valor anterior da c1 e fazer os difs.

como ficaria? tenho que incluir muitos outros campos, mas ja me daria um exemplo do caminho das pedras

M

Não sabia que podia simplesmente fazer table3 a. Sem um “AS”.
Isto é característico somente do MySQL?

D

A solução já foi dita, agora transforme para sua realidade.

D

Acredito que outros bancos tem, pelo menos MySQL e SQL Server eu sei que funciona.

Criado 20 de julho de 2016
Ultima resposta 20 de jul. de 2016
Respostas 13
Participantes 4