Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

brino

[Resolvido] Group By

Recommended Posts

Estou tentando fazer um SELECT utilizando o GROUP BY por data e selecionando o ultimo registro do período.

 

Tenho uma tabela fluxo de caixa.

id     data        entrada      saida       saldo
1      2012-10-01  300,00       0,00         300,00
2      2012-10-01  30,00        0,00         330,00
3      2012-10-01  0,00         100,00       230,00
4      2012-10-02  0,00         50,00        180,00
5      2012-10-02  180,00       0,00         360,00
6      2012-10-03  50,00        0,00         410,00
7      2012-10-03  0,00       110,00         300,00

 

SELECT id, data, sum(entrada) as entrada, sum(saida) AS saida, saldo FROM fluxo GROUP BY data;

 

id     data        entrada      saida       saldo     saldo(esperado)
1      2012-10-01  330,00       100,00      300,00    230,00 (id = 3)
4      2012-10-02  180,00       50,00       180,00    360,00 (id = 5)
6      2012-10-03  50,00        110,00      410,00    300,00 (id = 7)

 

Só que nesse consulta, o saldo que me retorna é o do primeiro registro do período, quero que retorne o ultimo saldo do período.

 

Como faria para retornar o ultimo registro do campo saldo nesse SELECT? Não sei se é possível, mas espero que tenha alguma maneira de resolver isso.

 

Obrigado e no aguardo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Combine este dos selects

 

SELECT id, data, sum(entrada) as entrada, sum(saida) AS saida 
FROM fluxo 
GROUP BY data

 

SELECT id, data, saldo 
FROM fluxo f2
where id = (SELECT max(id) 
           FROM fluxo f3
           where f3.data = f2.data)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta,

 

Entendi o que você quis dizer, mas como faria para colocar isso tudo em um select apenas?

Tentei colocar isso com um inner join, mas ele me retorna sempre o maior valor da tabela.

 

SELECT a.id, a.data, sum(a.entrada) AS entrada, sum(a.saida) AS saida, b.saldo

FROM tb a

INNER JOIN tb AS b ON b.id = (SELECT max(c.id) FROM tb c) GROUP BY a.data

 

id     data        entrada      saida       saldo
3      2012-10-01  330,00       100,00      300,00
5      2012-10-02  180,00       50,00       300,00
7      2012-10-03  50,00        110,00      300,00

 

No caso me retorna apenas o ultimo saldo da tabela e não do período em questão.

Compartilhar este post


Link para o post
Compartilhar em outros sites
select v1.id, v1.data,v1.entrada, v1.saida , v2.saldo 
from
(SELECT id, data, sum(entrada) as entrada, sum(saida) AS saida 
FROM fluxo 
GROUP BY data) v1,
(SELECT id, data, saldo 
FROM fluxo f2
where id = (SELECT max(id) 
            FROM fluxo f3
            where f3.data = f2.data) v2
where v1.id = v2.id
and v1.data = v2.data

Compartilhar este post


Link para o post
Compartilhar em outros sites

select v1.id, v1.data,v1.entrada, v1.saida , v2.saldo 
from
(SELECT id, data, sum(entrada) as entrada, sum(saida) AS saida 
FROM fluxo 
GROUP BY data) v1,
(SELECT id, data, saldo 
FROM fluxo f2
where id = (SELECT max(id)
            FROM fluxo f3
            where f3.data = f2.data) v2
where v1.data = v2.data

 

select v1.id, v1.data, v1.entrada, v1.saida , v2.saldo 
from
(SELECT id, data, sum(entrada) as entrada, sum(saida) AS saida 
FROM fluxo 
GROUP BY data) v1,
(SELECT f2.id, f2.data, f2.saldo 
FROM fluxo f2
where f2.id = (SELECT max(f3.id)
            FROM fluxo f3
            where f3.data = f2.data)) v2
where v1.id = v2.id
and v1.data = v2.data

 

Cara, nunca usei select dessa maneira, muito diferente.

Coisas só de quem conhece muita coisa, hehe.

 

Fiz como você sugeriu, mas esta me retornando um erro.

Unknown column 'v1.entrada' in 'field list'

 

@Edit,

 

Olha vi aqui qual foi o erro, mas quando fui ver o resultado, me retornou apenas o ultimo período apenas.

 

@Edit novamente,

 

Descobri, tinha que retirar uma condição: v1.id = v2.id

 

Obrigado e abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.