CommandText... problemas com instrução select max...
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
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
Curtidas 0
Respostas
Bon Jovi
08/02/2005
Nao é por causa dessas aspas q vc colocou no apelido Valor?
GOSTEI 0
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
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
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
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
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
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
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.
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
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
Um abraço,
Leo
GOSTEI 0
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
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
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
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
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
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
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
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
08/02/2005
que banco de dados você utiliza?
GOSTEI 0
Leoback
08/02/2005
Amigo,
No momento estou utilizando a versão IB 7.1 da Borland.
Abraços,
Leo
No momento estou utilizando a versão IB 7.1 da Borland.
Abraços,
Leo
GOSTEI 0