Fórum Como fazer um group by sem ter que passar todas as colunas do select? #442956
16/05/2013
0
Bom dia, tenho o seguinte select, cujo objetivo é selecionar todos os clientes que não tiveram vendas desde o dia X, e de quera ja trazer a data da ultima venda e o numero da nota fiscal:
Porém dessa forma ele me traz o seguinte:
19 | 300 | 26-09-2005
19 | 356 | 29-09-2005
27 | 842 | 10-05-2012
Ou seja, as 2 primeiras linhas são do mesmo cliente(cód. 19), gostaria que ele pegasse somente 1 registro de cada cliente, que seria o registro com a maior data, no caso, o segundo registro dessa lista.
Por lógica teria que tirar o mov.numeroNf do group by, mas se fizer, logicamente, da o erro:
Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause).
Como posso fazer isso?
select mov.codCliente,mov.numeroNf,max(mov.data) from movimentacoesclientes mov group by mov.codCliente,mov.numeroNf having max(mov.data)<='05-16-2013'
Porém dessa forma ele me traz o seguinte:
19 | 300 | 26-09-2005
19 | 356 | 29-09-2005
27 | 842 | 10-05-2012
Ou seja, as 2 primeiras linhas são do mesmo cliente(cód. 19), gostaria que ele pegasse somente 1 registro de cada cliente, que seria o registro com a maior data, no caso, o segundo registro dessa lista.
Por lógica teria que tirar o mov.numeroNf do group by, mas se fizer, logicamente, da o erro:
Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause).
Como posso fazer isso?
Mateus Viccari
Curtir tópico
+ 0
Responder
Posts
16/05/2013
Joel Rodrigues
Acho que neste caso você precisará de uma subquery. Por exemplo:
O caminho é esse, mas você tem de ver aí como fazer, pois eu estou sem o Firbird aqui para testar e nesse caso pode haver mais de uma nota para o cliente na mesma data, então a primeira subquery seria inválida, pois retornaria mais de uma linha.
SELECT mov.codCliente, (SELECT m.numeroNf FROM movimentacoesclientes m WHERE m.codCliente = mov.codCliente AND m.data = MAX(mov.data)) AS NumeroNF, MAX (mov.data) FROM movimentacoesclientes mov GROUP BY mov.codCliente HAVING max(mov.data)<='05-16-2013'
O caminho é esse, mas você tem de ver aí como fazer, pois eu estou sem o Firbird aqui para testar e nesse caso pode haver mais de uma nota para o cliente na mesma data, então a primeira subquery seria inválida, pois retornaria mais de uma linha.
Responder
Gostei + 0
31/07/2013
José
Olá amigo Mateus, testou esse código que o amigo Joel passou, ajudou a solucionar seu problema ?
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)