Melhor select para um problema.
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?
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
Curtidas 0
Respostas
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
    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
30/11/2004
Não tá dando certo, dá um erro de operador faltando na expressão.
GOSTEI 0
Balceiro
30/11/2004
o windows mostra essa linha
e diz manda a mensagem: Operador faltando
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
30/11/2004
publique a estrutura das tabelas envolvidas...
GOSTEI 0
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
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.
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
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
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
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:
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
30/11/2004
Utilizo bando Access.
GOSTEI 0
Balceiro
30/11/2004
também não funcionou.
GOSTEI 0