GROUP BY POR NOME, MOSTRANDO REGISTRO COM A MAIOR DATA DE LANCAMENTO
Bom dia a todos
Pessoal, sou novo no fórum e estou com um problema. Estou tentando agrupar dois campos somente(NOMECLIENTE, DATAVENCIMENTO) mas da forma q estou fazendo ele ate agrupa, mas esta mostrando o mesmo cliente varias vezes em datas diferentes. Preciso q mostre somente uma vez com a maior data.
Delphi 7, Firebird
Nao tenho a função q estou utilizando por q nao estou em casa no momento. Mas salvo engano, estou utilizando da seguinte forma:
select NOMECLIENTE, DATAVENCIMENTO MAX(DATAVENCIMENTO
from CLIENTE
GroupBy NOMECLIENTE, DATAVENCIMENTO
Exemplo de como esta os registros na tabela
CLIENTE-DATAVENCIMENTO
A - 01/01/2024
A - 01/02/2024
A - 01/03/2024
B - 01/01/2024
B - 01/02/2024
B - 01/03/2024
Preciso que me retorne assim:
CLIENTE - DATAVENCIMENTO
A - 01/03/2024
B - 01/03/2024
Pessoal, sou novo no fórum e estou com um problema. Estou tentando agrupar dois campos somente(NOMECLIENTE, DATAVENCIMENTO) mas da forma q estou fazendo ele ate agrupa, mas esta mostrando o mesmo cliente varias vezes em datas diferentes. Preciso q mostre somente uma vez com a maior data.
Delphi 7, Firebird
Nao tenho a função q estou utilizando por q nao estou em casa no momento. Mas salvo engano, estou utilizando da seguinte forma:
select NOMECLIENTE, DATAVENCIMENTO MAX(DATAVENCIMENTO
from CLIENTE
GroupBy NOMECLIENTE, DATAVENCIMENTO
Exemplo de como esta os registros na tabela
CLIENTE-DATAVENCIMENTO
A - 01/01/2024
A - 01/02/2024
A - 01/03/2024
B - 01/01/2024
B - 01/02/2024
B - 01/03/2024
Preciso que me retorne assim:
CLIENTE - DATAVENCIMENTO
A - 01/03/2024
B - 01/03/2024
Heder
Curtidas 0
Melhor post
Weber
29/02/2024
select NOMECLIENTE, MAX(DATAVENCIMENTO) as DATAVENCIMENTO from CLIENTE
GroupBy NOMECLIENTE
GroupBy NOMECLIENTE
GOSTEI 1
Mais Respostas
Heder
29/02/2024
select NOMECLIENTE, MAX(DATAVENCIMENTO) as DATAVENCIMENTO from CLIENTE
GroupBy NOMECLIENTE
GroupBy NOMECLIENTE
==
Boa noite, Muito obrigado! Certinho!
GOSTEI 0
Heder
29/02/2024
Outra duvida relacinada ao mesmo assunto.
Tem como aplicar o filtro depois do agrupamento? Por q precisei filtar so que dai fica errado o resultado.
Precisaria agrupar tudo, conforme o código acima q ficou certinho e dai filtrar o que foi agrupado pela data menor q a do sistema.
Minha instrução está assim:
With Q1 do
begin
Close;
SQL.Clear ;
SQL.Add('Select REGISTRADOPARACOD, REGISTRADOPARA, MAX(DTASEGURO) as DTASEGURO');
SQL.Add('FROM DONATE');
SQL.Add('WHERE DTASEGURO <= :Hoje');
SQL.Add('GROUP BY REGISTRADOPARACOD, REGISTRADOPARA');
SQL.ADD('ORDER BY DTASEGURO DESC');
ParamByName('Hoje').AsDate := Date;
Open;
end;
end;
Dessa forma agrupa certinho, porém o filtro ta sendo aplicado antes do agrupamento e com isso ele fica retornando os clientes q ainda nao venceram o seguro. Por isso precisaria agrupar tudo, mostrar no agrupamento a ultima data e dai filtrar tudo para mostrar somente os que estao com data menor q a do sistema(atual)
Em resumo seria: APLICAR O FILTRO DEPOIS DO AGRUPAMENTO
Desde de já agradeço
Tem como aplicar o filtro depois do agrupamento? Por q precisei filtar so que dai fica errado o resultado.
Precisaria agrupar tudo, conforme o código acima q ficou certinho e dai filtrar o que foi agrupado pela data menor q a do sistema.
Minha instrução está assim:
With Q1 do
begin
Close;
SQL.Clear ;
SQL.Add('Select REGISTRADOPARACOD, REGISTRADOPARA, MAX(DTASEGURO) as DTASEGURO');
SQL.Add('FROM DONATE');
SQL.Add('WHERE DTASEGURO <= :Hoje');
SQL.Add('GROUP BY REGISTRADOPARACOD, REGISTRADOPARA');
SQL.ADD('ORDER BY DTASEGURO DESC');
ParamByName('Hoje').AsDate := Date;
Open;
end;
end;
Dessa forma agrupa certinho, porém o filtro ta sendo aplicado antes do agrupamento e com isso ele fica retornando os clientes q ainda nao venceram o seguro. Por isso precisaria agrupar tudo, mostrar no agrupamento a ultima data e dai filtrar tudo para mostrar somente os que estao com data menor q a do sistema(atual)
Em resumo seria: APLICAR O FILTRO DEPOIS DO AGRUPAMENTO
Desde de já agradeço
GOSTEI 0
Guttizin
29/02/2024
Não é conflito com o nome da coluna que vc tá está sobreescrevendo MAX(DTASEGURO) as DTASEGURO?
O <where> pode estar verificando o MAX(DTASEGURO) [renomeada para DTASEGURO] ao invés de o DTASEGURO da tabela original DONATE.
Para evitar conflito nesse sentido, recomendo utilizar <alias> na tabela ou até mesmo chamar o <where> com o nome da tabela.
SQL.Add('FROM DONATE');
SQL.Add('WHERE donate.DTASEGURO <= :Hoje');
ou
SQL.Add('FROM DONATE d');
SQL.Add('WHERE d.DTASEGURO <= :Hoje');
O <where> pode estar verificando o MAX(DTASEGURO) [renomeada para DTASEGURO] ao invés de o DTASEGURO da tabela original DONATE.
Para evitar conflito nesse sentido, recomendo utilizar <alias> na tabela ou até mesmo chamar o <where> com o nome da tabela.
SQL.Add('FROM DONATE');
SQL.Add('WHERE donate.DTASEGURO <= :Hoje');
ou
SQL.Add('FROM DONATE d');
SQL.Add('WHERE d.DTASEGURO <= :Hoje');
GOSTEI 1
Heder
29/02/2024
Não é conflito com o nome da coluna que vc tá está sobreescrevendo MAX(DTASEGURO) as DTASEGURO?
O <where> pode estar verificando o MAX(DTASEGURO) [renomeada para DTASEGURO] ao invés de o DTASEGURO da tabela original DONATE.
Para evitar conflito nesse sentido, recomendo utilizar <alias> na tabela ou até mesmo chamar o <where> com o nome da tabela.
SQL.Add('FROM DONATE');
SQL.Add('WHERE donate.DTASEGURO <= :Hoje');
ou
SQL.Add('FROM DONATE d');
SQL.Add('WHERE d.DTASEGURO <= :Hoje');
O <where> pode estar verificando o MAX(DTASEGURO) [renomeada para DTASEGURO] ao invés de o DTASEGURO da tabela original DONATE.
Para evitar conflito nesse sentido, recomendo utilizar <alias> na tabela ou até mesmo chamar o <where> com o nome da tabela.
SQL.Add('FROM DONATE');
SQL.Add('WHERE donate.DTASEGURO <= :Hoje');
ou
SQL.Add('FROM DONATE d');
SQL.Add('WHERE d.DTASEGURO <= :Hoje');
==
Boa tarde, vou testar. Muito obrigado
GOSTEI 0
Arthur Heinrich
29/02/2024
Um usuário pode ter vários seguros, a ideia é pegar todos que tem como último seguro (mais recente), com data menor que a data atual.
Ao filtrar os registros no WHERE, a query computa como maior data, a maior data anterior à data de sistema, que não necessariamente é o seguro mais recente.
Então, o filtro precisa ocorrer após o agrupamento, utilizando a cláusula HAVING, que vem depois do GROUP BY.
Ao filtrar os registros no WHERE, a query computa como maior data, a maior data anterior à data de sistema, que não necessariamente é o seguro mais recente.
Então, o filtro precisa ocorrer após o agrupamento, utilizando a cláusula HAVING, que vem depois do GROUP BY.
SQL.Add('Select REGISTRADOPARACOD, REGISTRADOPARA, MAX(DTASEGURO) as DTASEGURO'); SQL.Add('FROM DONATE'); SQL.Add('GROUP BY REGISTRADOPARACOD, REGISTRADOPARA'); SQL.Add('HAVING MAX(DTASEGURO) <= :Hoje'); SQL.ADD('ORDER BY DTASEGURO DESC'); ParamByName('Hoje').AsDate := Date;
GOSTEI 0
Heder
29/02/2024
Um usuário pode ter vários seguros, a ideia é pegar todos que tem como último seguro (mais recente), com data menor que a data atual.
Ao filtrar os registros no WHERE, a query computa como maior data, a maior data anterior à data de sistema, que não necessariamente é o seguro mais recente.
Então, o filtro precisa ocorrer após o agrupamento, utilizando a cláusula HAVING, que vem depois do GROUP BY.
Ao filtrar os registros no WHERE, a query computa como maior data, a maior data anterior à data de sistema, que não necessariamente é o seguro mais recente.
Então, o filtro precisa ocorrer após o agrupamento, utilizando a cláusula HAVING, que vem depois do GROUP BY.
SQL.Add('Select REGISTRADOPARACOD, REGISTRADOPARA, MAX(DTASEGURO) as DTASEGURO'); SQL.Add('FROM DONATE'); SQL.Add('GROUP BY REGISTRADOPARACOD, REGISTRADOPARA'); SQL.Add('HAVING MAX(DTASEGURO) <= :Hoje'); SQL.ADD('ORDER BY DTASEGURO DESC'); ParamByName('Hoje').AsDate := Date;
==
Boa noite! Bem isso que precisava. Muito obrigado a todos. Então só a titulo de compreenssão: WHERE utilizo antes do GROUP BY e o HAVIN após. Isso? WHERE filtra antes e o HAVING depois do GROUP BY?
GOSTEI 0