CommandText... problemas com instrução select max...

Delphi

08/02/2005

Amigos do fórum...

Estou tendo dificuldades em executar um select max quando passo para o CommandText de um ClientDataSet... Ao tentar executá-lo, o Delphi retorna ´Invalid Column Reference´. Segue a instrução para avaliação.

´select max (HISTORICOPRECOS.VALORCOTADO) as ´Valor´, HISTORICOPRECOS.IDHISTORICO, PRODUTOS.REFERENCIAINTERNA, PRODUTOS.ESTAGIO,TIPOPRODUTO.DESCRICAOTIPOPRODUTO
from HISTORICOPRECOS, PRODUTOS, TIPOPRODUTO
where HISTORICOPRECOS.IDPRODUTO = PRODUTOS.IDPRODUTO and PRODUTOS.IDTIPOPRODUTO = TIPOPRODUTO.IDTIPOPRODUTO and PRODUTOS.REFERENCIAINTERNA like :REFERENCIAINTERNA´

Se alguém puder ajudar, agradeço imensamente.

Leo


Leoback

Leoback

Curtidas 0

Respostas

Bon Jovi

Bon Jovi

08/02/2005

Nao é por causa dessas aspas q vc colocou no apelido Valor?


GOSTEI 0
Nandolh

Nandolh

08/02/2005

Select Corrigido:


select max (HISTORICOPRECOS.VALORCOTADO) as ´Valor´, HISTORICOPRECOS.IDHISTORICO, PRODUTOS.REFERENCIAINTERNA, PRODUTOS.ESTAGIO,TIPOPRODUTO.DESCRICAOTIPOPRODUTO
from HISTORICOPRECOS, PRODUTOS, TIPOPRODUTO
where HISTORICOPRECOS.IDPRODUTO = PRODUTOS.IDPRODUTO and PRODUTOS.IDTIPOPRODUTO = TIPOPRODUTO.IDTIPOPRODUTO and PRODUTOS.REFERENCIAINTERNA like :REFERENCIAINTERNA

group by HISTORICOPRECOS.IDHISTORICO, PRODUTOS.REFERENCIAINTERNA, PRODUTOS.ESTAGIO,TIPOPRODUTO.DESCRICAOTIPOPRODUTO


GOSTEI 0
Leoback

Leoback

08/02/2005

Select Corrigido: select max (HISTORICOPRECOS.VALORCOTADO) as ´Valor´, HISTORICOPRECOS.IDHISTORICO, PRODUTOS.REFERENCIAINTERNA, PRODUTOS.ESTAGIO,TIPOPRODUTO.DESCRICAOTIPOPRODUTO from HISTORICOPRECOS, PRODUTOS, TIPOPRODUTO where HISTORICOPRECOS.IDPRODUTO = PRODUTOS.IDPRODUTO and PRODUTOS.IDTIPOPRODUTO = TIPOPRODUTO.IDTIPOPRODUTO and PRODUTOS.REFERENCIAINTERNA like :REFERENCIAINTERNA group by HISTORICOPRECOS.IDHISTORICO, PRODUTOS.REFERENCIAINTERNA, PRODUTOS.ESTAGIO,TIPOPRODUTO.DESCRICAOTIPOPRODUTO


Valeu Nando! Agora funcionou... Irmão, na tabela HistoricoPrecos tem uma série de valores para cada Produto cadastrado... desse modo eu gostaria de ao escolher um produto o select me retornar o maior VALORCOTADO para ele... Não estou conseguindo sair de jeito nenhum... Se puderes ajudar mais uma vez agradeço.

Segue o relacionamento entre as tabelas...

Um grande abraço.

Leo


GOSTEI 0
Nandolh

Nandolh

08/02/2005

SEU SELECT DEVE SER DA SEGUINTE FORMA:

Retire o campo HISTORICOPRECOS.IDHISTORICO pois ele é uma informação variável e portanto não tem como agrupá-lo,

select max (HISTORICOPRECOS.VALORCOTADO) as ´Valor´, PRODUTOS.REFERENCIAINTERNA, PRODUTOS.ESTAGIO,TIPOPRODUTO.DESCRICAOTIPOPRODUTO
from HISTORICOPRECOS, PRODUTOS, TIPOPRODUTO
where PRODUTOS.IDTIPOPRODUTO = TIPOPRODUTO.IDTIPOPRODUTO and PRODUTOS.REFERENCIAINTERNA like :REFERENCIAINTERNA
group by RODUTOS.REFERENCIAINTERNA, PRODUTOS.ESTAGIO,TIPOPRODUTO.DESCRICAOTIPOPRODUTO

Abraços
Herrmann


GOSTEI 0
Leoback

Leoback

08/02/2005

SEU SELECT DEVE SER DA SEGUINTE FORMA: Retire o campo HISTORICOPRECOS.IDHISTORICO pois ele é uma informação variável e portanto não tem como agrupá-lo, select max (HISTORICOPRECOS.VALORCOTADO) as ´Valor´, PRODUTOS.REFERENCIAINTERNA, PRODUTOS.ESTAGIO,TIPOPRODUTO.DESCRICAOTIPOPRODUTO from HISTORICOPRECOS, PRODUTOS, TIPOPRODUTO where PRODUTOS.IDTIPOPRODUTO = TIPOPRODUTO.IDTIPOPRODUTO and PRODUTOS.REFERENCIAINTERNA like :REFERENCIAINTERNA group by RODUTOS.REFERENCIAINTERNA, PRODUTOS.ESTAGIO,TIPOPRODUTO.DESCRICAOTIPOPRODUTO Abraços Herrmann


Herman, meu amigo, perdoe-me pela confusão que estou fazendo mas esse código é muito importante para mim no momento. O que pretendo é selecionar o último VALORCOTADO e não o maior VALORCOTADO como dissera anteriormente. Eu gostaria que o select ao ser executado retornasse o último IDHISTORICO em correspondência com o VALORCOTADO. Tentei dar um Select max (HP.IDHISTORICO) as ´IDHIST´ <resto do código> sem incluir esse campo no Group by mas não funciounou... O select retorna todos os campos IDHISTORICO...

Se puder ajudar mais uma vez agradeço.

Um grande abraço,

Leo


GOSTEI 0
Nandolh

Nandolh

08/02/2005

Olá Leo:

Posso te passar um exemplo:
Tenho uma tabela de Históricos e outra de Centros de Custo. Cada Historico possui um Centro de Custo. Desejo obter o maior Historico, descricao do historico e seu respectivo Centro de Custo...

SELECT[b:4497483f7b] FIRST 1 MAX[/b:4497483f7b](H.COD_HISTORICO), H.DES_HISTORICO, C.DES_CUSTO FROM HISTORICO H
JOIN CENTRO_CUSTO C ON C.COD_CUSTO = H.COD_CUSTO

GROUP BY H.COD_HISTORICO,H.DES_HISTORICO,C.DES_CUSTO
ORDER BY H.COD_HISTORICO [b:4497483f7b]DESC[/b:4497483f7b]

Observe o [b:4497483f7b]DESC[/b:4497483f7b] no order by e o[b:4497483f7b] FIRST 1[/b:4497483f7b] logo depois do SELECT...
Talvez isto lhe ajude: faça um order by DESC em IDHISTORICO e um first 1 no SELECT. Importante: O [b:4497483f7b]DESC[/b:4497483f7b] precisa ser colocado imediatamente depois de cada campo que vc deseja por em ordem decrescente.


GOSTEI 0
Leoback

Leoback

08/02/2005

Valeu mais uma vez amigo Herman... tentei a SQL que você passou inclusive recriando as suas tabelas para entender melhor o funcionamento... mas está dando erro... o IB 7.1 não está interpretando o [color=blue:c8c6a41c5e]Select First 1[/color:c8c6a41c5e] e retorna um erro... Eu já estou pesquisando como farei para usar o comando ao tempo em que agradeço a sua ajuda e atenção.

Um abraço,

Leo


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

08/02/2005

tente assim:


SELECT MAX(H.COD_HISTORICO), H.DES_HISTORICO, C.DES_CUSTO FROM HISTORICO H
JOIN CENTRO_CUSTO C ON C.COD_CUSTO = H.COD_CUSTO
GROUP BY H.COD_HISTORICO,H.DES_HISTORICO,C.DES_CUSTO
ORDER BY H.COD_HISTORICO DESC
ROWS 1


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

08/02/2005

ou melhor: visto que você está utilizando a ordenação em conjunto com a cláusula ROWS, não é necessário utilizar a função MAX() nem o Group By.

SELECT H.COD_HISTORICO, H.DES_HISTORICO, C.DES_CUSTO
FROM HISTORICO H
LEFT JOIN CENTRO_CUSTO C ON (C.COD_CUSTO = H.COD_CUSTO)
ORDER BY H.COD_HISTORICO DESC
ROWS 1


GOSTEI 0
Leoback

Leoback

08/02/2005

ou melhor: visto que você está utilizando a ordenação em conjunto com a cláusula ROWS, não é necessário utilizar a função MAX() nem o Group By. SELECT H.COD_HISTORICO, H.DES_HISTORICO, C.DES_CUSTO FROM HISTORICO H LEFT JOIN CENTRO_CUSTO C ON (C.COD_CUSTO = H.COD_CUSTO) ORDER BY H.COD_HISTORICO DESC ROWS 1


Valeu Emerson! O código funcionou a contento.... mas tem um detalhe... o que preciso é que o Select retorne máximo valor do COD_HISTORICO para cada DES_CUSTO e único... seria mais ou menos assim (ver figura abaixo)...

Tabela com todos os registros: Select... where (CENTROCUSTO.DES_CUSTO LIKE ´¬´)

O que preciso é que a tabela contenha o máximo valor do COD_HISTORICO para cada DES_CUSTO (Unico)...

Espero que tenha entendido e possa me ajudar mais uma vez.

Um cordial abraço,

Leo


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

08/02/2005

tente com subselect. não testei, mas acho que assim funciona:

SELECT
  MAX(H.COD_HISTORICO) COD_HISTORICO,
  (select DES_HISTORICO
   from HISTORICO
   where HISTORICO.COD_HISTORICO=Max(H.COD_HISTORICO)) DES_HISTORICO,
  C.DES_CUSTO
FROM HISTORICO H 
JOIN CENTRO_CUSTO C ON (C.COD_CUSTO = H.COD_CUSTO)
GROUP BY H.COD_CUSTO, C.DES_CUSTO



GOSTEI 0
Leoback

Leoback

08/02/2005

Muito agradecido mais uma vez Emerson.
Infelizmente o Select não rodou mas acho que você passou a idéia de que com uma subquery o resultado sai. Vou pesquisar com algum material que tenho para tentar validar o Select.

Um grande abraço,

Leo


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

08/02/2005

que banco de dados você utiliza?


GOSTEI 0
Leoback

Leoback

08/02/2005

Amigo,

No momento estou utilizando a versão IB 7.1 da Borland.

Abraços,

Leo


GOSTEI 0
POSTAR