GARANTIR DESCONTO

Fórum CommandText... problemas com instrução select max... #267759

08/02/2005

0

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

Responder

Posts

08/02/2005

Bon Jovi

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


Responder

Gostei + 0

08/02/2005

Nandolh

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


Responder

Gostei + 0

08/02/2005

Leoback

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
[img:6188395114]http://www.cpibrasil.winconnection.net/ftp/01.jpg[/img:6188395114]


Responder

Gostei + 0

10/02/2005

Nandolh

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


Responder

Gostei + 0

11/02/2005

Leoback

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


Responder

Gostei + 0

11/02/2005

Nandolh

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.


Responder

Gostei + 0

12/02/2005

Leoback

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


Responder

Gostei + 0

13/02/2005

Emerson Nascimento

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


Responder

Gostei + 0

13/02/2005

Emerson Nascimento

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


Responder

Gostei + 0

16/02/2005

Leoback

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 ´¬´)
[img:802106f4c5]http://cpibrasil.winconnection.net/ftp/imagem.jpg[/img:802106f4c5]

O que preciso é que a tabela contenha o máximo valor do COD_HISTORICO para cada DES_CUSTO (Unico)...
[img:802106f4c5]http://cpibrasil.winconnection.net/ftp/imagem2.jpg[/img:802106f4c5]

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

Um cordial abraço,

Leo


Responder

Gostei + 0

16/02/2005

Emerson Nascimento

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



Responder

Gostei + 0

17/02/2005

Leoback

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


Responder

Gostei + 0

18/02/2005

Emerson Nascimento

que banco de dados você utiliza?


Responder

Gostei + 0

19/02/2005

Leoback

Amigo,

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

Abraços,

Leo


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar