Melhor select para um problema.

Delphi

30/11/2004

Estou desenvolvendo uma aplicação e meu cliente pediu para mim fazer um relatório que totalize a qtde de produtos vendidos num determinado período.

Os produtos vendido ficam em minha tabela bdItensPedido e Meu cadastro de produtos fica na tabela bdProdutos.

Qual a melhor forma de fazer uma select para isso?


Balceiro

Balceiro

Curtidas 0

Respostas

Emerson Nascimento

Emerson Nascimento

30/11/2004

select IPED.CodigoDoProduto, max(PROD.Descricao),
    AVG(IPED.ValorUnitario) VlrUnitMedio,
    Sum(IPED.Quantidade) Qtd_Total
from bdPedido PED
inner join bdItensPedido IPED on (IPED.IdentificadorDoPedido=PED.IdentificadorDoPedido)
inner join bdProdutos PR on (PR.IdentificadorDoProduto=IPED.IdentificadorDoProduto)
where PED.DataVenda between :datainicial and :datafinal
group by IPED.CodigoDoProduto


GOSTEI 0
Balceiro

Balceiro

30/11/2004

Não tá dando certo, dá um erro de operador faltando na expressão.


GOSTEI 0
Balceiro

Balceiro

30/11/2004

o windows mostra essa linha

inner join bdItensPedido IPED on (IPED.IdentificadorDoPedido=PED.IdentificadorDoPedido) 
inner join bdProdutos PR on (PR.IdentificadorDoProduto=IPED.IdentificadorDoProduto) 


e diz manda a mensagem: Operador faltando


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

30/11/2004

publique a estrutura das tabelas envolvidas...


GOSTEI 0
Bruno Belchior

Bruno Belchior

30/11/2004

olha ai:
select IPED.CodigoDoProduto, max(PROD.Descricao), 
    AVG(IPED.ValorUnitario) VlrUnitMedio, 
    Sum(IPED.Quantidade) Qtd_Total 
from bdPedido PED, bdProdutos IPED 
inner join bdItensPedido IPED on (IPED.IdentificadorDoPedido=PED.IdentificadorDoPedido) 
inner join bdProdutos PR on (PR.IdentificadorDoProduto=IPED.IdentificadorDoProduto) 
where PED.DataVenda between :datainicial and :datafinal 
group by IPED.CodigoDoProduto



GOSTEI 0
Emerson Nascimento

Emerson Nascimento

30/11/2004

corrigindo....

select IPED.CodigoDoProduto, max(PROD.Descricao),
    AVG(IPED.ValorUnitario) VlrUnitMedio,
    Sum(IPED.Quantidade) Qtd_Total
from bdPedido PED
inner join bdItensPedido IPED on (IPED.IdentificadorDoPedido=PED.IdentificadorDoPedido)
inner join bdProdutos PROD on (PROD.IdentificadorDoProduto=IPED.IdentificadorDoProduto)
where PED.DataVenda between :datainicial and :datafinal
group by IPED.CodigoDoProduto

o erro estava no alias PR, que na verdade deveria ser PROD, pois os campos se referenciavam a PROD. agora deve dar certo, desde que você informe seus campos de relacionamento corretamente. para poder ajudar de uma forma mais eficaz, seria necessário você publicar a estrutura das suas tabelas bdItensPedido, bdProdutos e da tabela de pedidos.


GOSTEI 0
Balceiro

Balceiro

30/11/2004

emerson, alterei pro jeito que vc colocou e continua o mesmo erro:


erro de sintaxe (operador faltando) na expressão de consulta 
´(IPED.Cod_Pedido=PED.Cod) inner join bdProdutos PROD on (PROD.Cod_Barras=IPED.Cod_Produto)´



GOSTEI 0
Balceiro

Balceiro

30/11/2004

esta é a minha estrutura:

  
     Close;
     Sql.Clear;
     a:= ´select bdItens_Pedido.Cod_Produto, max (bdProduto.Descricao_Produto), AVG(bdItens_Pedido.Valor_Unt) as VlrUnitMedio, Sum(bdItens_Pedido.Qtde) as Qtd_Total ´;

     b := ´FROM bdPedido PED inner join bdItensPedido IPED on (IPED.Cod_Pedido=PED.Cod) inner join bdProdutos PROD on (PROD.Cod_Barras=IPED.Cod_Produto) where PED.Emissao between :datainicial and :datafinal group by IPED.Cod_Produto´;

     Sql.Add(a+b);

     Parameters[0].Value := rxDataIni.Text;
     Parameters[1].Value := rxDataFim.Text;
     Open;



GOSTEI 0
Emerson Nascimento

Emerson Nascimento

30/11/2004

deveria ser assim:

Close;
Sql.Clear;
a := ´select IPED.Cod_Produto, max (PROD.Descricao_Produto), ´+
        ´AVG(IPED.Valor_Unt) as VlrUnitMedio, Sum(IPED.Qtde) as Qtd_Total ´;

b := ´FROM bdPedido PED ´+
        ´inner join bdItensPedido IPED on (IPED.Cod_Pedido=PED.Cod) ´+
        ´inner join bdProdutos PROD on (PROD.Cod_Barras=IPED.Cod_Produto) ´+
        ´where PED.Emissao between :datainicial and :datafinal ´+
        ´group by IPED.Cod_Produto´;

Sql.Add(a+b);

Parameters[0].Value := rxDataIni.Text;
Parameters[1].Value := rxDataFim.Text;
Open;

note que onde esta IPED, PROD e PED [b:c5aea7d08a]DEVERÁ SER MANTIDO ASSIM[/b:c5aea7d08a], pois são os aliases (apelidos) das tabelas. as demais alterações são apenas estéticas.

dúvidas:
qual banco de dados você está utilizando :?:
o relacionamento das tabelas bdProdutos e bdItensPedido é realmente pelo campo Cod_Barras :?:

mais uma coisa: eu havia solicitado a estrutura das tabelas, não a instrução SQL. mas com a instrução dessa forma já deu pra entender como devem ser feitos os relacionamentos. :wink:


GOSTEI 0
Balceiro

Balceiro

30/11/2004

Utilizo bando Access.


GOSTEI 0
Balceiro

Balceiro

30/11/2004

também não funcionou.


GOSTEI 0
POSTAR