Erro em Select com Group By

Delphi

01/10/2003

Colegas o que ha de errado com esse [b:c0875e8af6]Select[/b:c0875e8af6]


[b:c0875e8af6]with[/b:c0875e8af6] QryTemp [b:c0875e8af6]do[/b:c0875e8af6]
[b:c0875e8af6]begin[/b:c0875e8af6]
Close;
DatabaseName := DM.TArqEmpr.DatabaseName;
SQL.Clear;
SQL.Add(´select´);
SQL.Add(´C.v1 as Cod, C.v2 as Cliente, C.v4 as Municipio, C.v5 as UF,´);
SQL.Add(´C.v12 as Contato, C.v13 as Telefone,Max(N.nfi), N.dat as Data´);
SQL.Add(´from arqclie C, arqnfis N´);
SQL.Add(´Where C.v1 = N.cli´);
SQL.Add(´Group by n.nfi´);
ExecSQL;
Open;
[b:c0875e8af6]end;[/b:c0875e8af6]


Preciso pegar a ultima Nota (N.Nfi) do cliente apenas.


Macario

Macario

Curtidas 0

Respostas

Joilson_gouveia

Joilson_gouveia

01/10/2003

GROUP BY exige todas as colunas [b:8e0c00ab2e]não pertencentes[/b:8e0c00ab2e] as funções de agregação (MAX,MIN,AVG...). Vc fez o contrário!

mude para:

SQL.Add(´GROUP BY C.v1, C.v2, C.v4, C.v5,´);
SQL.Add(´C.v12, C.v13, N.dat´);


GOSTEI 0
Macario

Macario

01/10/2003

GROUP BY exige todas as colunas [b:7b40e229ec]não pertencentes[/b:7b40e229ec] as funções de agregação (MAX,MIN,AVG...). Vc fez o contrário! mude para: SQL.Add(´GROUP BY C.v1, C.v2, C.v4, C.v5,´); SQL.Add(´C.v12, C.v13, N.dat´);



Joilson

Olha só eu fiz isso mas é o seguinte, com isso ele nao devia me retornar apenas um registro por cliente, sendo esse registo o com maior valor na nota fiscal?

with QryTemp do
begin
Close;
DatabaseName := DM.TArqEmpr.DatabaseName;
SQL.Clear;
SQL.Add(´select´);
SQL.Add(´C.v1 as Cod, C.v2 as Cliente, C.v4 as Municipio, C.v5 as UF,´);
SQL.Add(´C.v12 as Contato, C.v13 as Telefone,Max (N.nfi) as Nota, N.dat as Data´);
SQL.Add(´from arqclie C, arqnfis N´);
SQL.Add(´Where C.v1 = N.cli´ );
SQL.Add(´Group by C.v1, C.v2, C.v4, C.v5, C.v12,C.v13, N.dat´);
SQL.Add(´order by c.v1´);
ExecSQL;
Open;
end;

Ou entao como poderia fazer isso


GOSTEI 0
Joilson_gouveia

Joilson_gouveia

01/10/2003

Quando agregamos uma consulta, para que retorne somente uma linha por valor agregado devemos garantir que todas as colunas não agregadas tenham o mesmo valor, senão o SQL interpreta como linhas distintas:

Ex.:
Nome UF Data Valor
João - DF - 01/01/2001 - R$ 100,00
João - DF - 01/02/2001 - R$ 50,00

Se quisermos pegar O MAIOR VALOR pago por João [b:ab1f58714e]não deveremos[/b:ab1f58714e] incluir na consulta a coluna DATA, pois tem valores distintos e o SQL
os traria.

Verifique em sua consulta que campos poderiam estar trazendo valores distintos e veja a possibilidade de não trazer essa coluna.


GOSTEI 0
Macario

Macario

01/10/2003

Valeu [b:e4cdf1163a][color=darkblue:e4cdf1163a]Joilson [/color:e4cdf1163a][/b:e4cdf1163a]vc me ajudou bastante :P :lol:


GOSTEI 0
Macario

Macario

01/10/2003

Valeu [b:8194092fe5][color=darkblue:8194092fe5]Joilson [/color:8194092fe5][/b:8194092fe5]vc me ajudou bastante :P :lol:


Outra coisa como eu mostro os outros campos que tem valores diferentes tipo data, valor tendo como exemplo o select acima

O Joilson, ou alguem poderia e esclarecer...isso?


GOSTEI 0
Marlon Spiess

Marlon Spiess

01/10/2003

No caso descrito, é obvio q a maior data é da nota de maior número, assim sendo é só usar max para data tbm, sem incluir a mesma no group by


GOSTEI 0
Macario

Macario

01/10/2003

[quote:cdbd36c29a=´Marlon Henrique Spiess´]No caso descrito, é obvio q a maior data é da nota de maior número, assim sendo é só usar max para data tbm, sem incluir a mesma no group by[/quote:cdbd36c29a]


Outra duvida colegas do código abaixo como faço para mostrar a quantidade de dias passados da data da nota, em outro campo que nao existe tipo ´Inativo´

try
with QryTemp do
begin
Close;
DatabaseName := DM.TArqEmpr.DatabaseName;
SQL.Clear;
SQL.Add(´select´);
SQL.Add(´C.v1 as Cod, C.v2 as Cliente, C.v4 as Municipio, C.v5 as UF,´);
SQL.Add(´C.v12 as Contato, C.v13 as Telefone, [b:cdbd36c29a]Max (N.Dat) as Data[/b:cdbd36c29a],Max(N.nfi) as Nota´);
SQL.Add(´from arqclie C, arqnfis N´);
SQL.Add(´Where (C.v1 = N.cli) and´ );
SQL.Add(´(c.v1 between :cli1 and :cli2)´);
SQL.Add(´Group by C.v1, C.v2, C.v4, C.v5, C.v12,C.v13´);
SQL.Add(´order by c.v1´);
Params[0].Value := mdtCliIni.Text;
Params[1].Value := mdtCliFim.Text;
ExecSQL;
Open;
end;


GOSTEI 0
Marlon Spiess

Marlon Spiess

01/10/2003

Desculpe, acho q a pergunta não está muito clara, se for para mostrar a dif. de dias da última nota para a data de hj, é só criar uma variavel em tempo de execução, após o open da query, tendo em vista q vc já tem essa data e não há a necessidade de fazer tudo dentro da query.

Caso a duvida seja outra, favor esclarecer melhor.


GOSTEI 0
Macario

Macario

01/10/2003

Eu preciso mostrar ha quantos dias foi a ultima compra de cada cliente, ou seja subtraindo a data da ultima nota, da data atual mas preciso que isso aparecça no grid?

Outra coisa é como mostrar tambem no grid o valor da ultima nota sendo que ele muda?


GOSTEI 0
Marlon Spiess

Marlon Spiess

01/10/2003

Se vc vai mostrar os dados em um grid, isso é fácil, crie no grid 2 campos, um de calculated e outro lookup, como, monte sua query dentro do componente, set active para true, os campos normais vão aparecer no grid, no componente query, duplo clik, vai abrir a tela para os campos, clik da direita, add all fields, depois clik dir. new fields e é só montar. os calculos devem ser feitos no evento oncalcfields do query mesmo.

Qualquer duvida é só retornar.

Boa sorte.

Marlon


GOSTEI 0
POSTAR