Como fazer um group by sem ter que passar todas as colunas do select?

Firebird

16/05/2013

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:
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

Mateus Viccari

Curtidas 0

Respostas

Joel Rodrigues

Joel Rodrigues

16/05/2013

Acho que neste caso você precisará de uma subquery. Por exemplo:

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.
GOSTEI 0
José

José

16/05/2013

Olá amigo Mateus, testou esse código que o amigo Joel passou, ajudou a solucionar seu problema ?
GOSTEI 0
POSTAR