SQL

MFLAVIO 27/04/2022 10:24:07
#499723
Bom dia Pessoal

estou me matando em uma Consulta de SQL

seguinte
tem 3 tabelas (Vendas, Sub_vendas e Vendas_PGTO)
Vendas tem os dados primarios da Venda(ID, data,Status e etc)
Sub_venda tem os itens da Venda(Nome do Item, Codigo do Item e etc)
Vendas_PGTO tem os dados de pagamento da venda(Valor, Tipo, e etc)

o Cliente agora quer um relatório
com a forma do Pagamento(valor do pagamento) e os Itens

o que ocorre e que uma venda pode ter vários itens e varias formas de pagamento

estou tentando assim de forma simples

 select 
venda.id,
venda_pgto.valor,
sub_venda.produto,
venda.data,
venda_pgto.tpag
from venda_pgto
inner join venda on (venda_pgto.ref = venda.id)
inner join sub_venda on (venda.id = sub_venda.ref)
where
(
(venda.status = "Finalizado")
and
(venda.data between "04/01/2022" and "04/27/2022")
)

a questão e que esta duplicando os valores então quando eu somo o total fica um valor exorbitante

explico:

por exemplo uma venda que teve 3 itens
me retorna assim

ID Valor Produto
10 R$ 150,00 XXXXXX
10 R$ 150,00 YYYYYY
11 R$ 230,00 XXXXXX

ou seja
no caso da venda 11 que só tinha 1 item na venda funciona perfeito
mais no caso da venda 10 que tem 2 itens o campo valor mostra o valor total 2X(1 para cada item) e ai que azeda o caldo

tentei agrupar pela forma de pagamento, mais ai o valor total fico muito abaixo do real

alguma dica para fazer funcionar essa consulta
KERPLUNK 27/04/2022 10:54:51
#499725
A tabela de itens está amarrada com a de vendas. E a de pagamentos?
MFLAVIO 27/04/2022 11:28:32
#499726
Citação:

:
A tabela de itens está amarrada com a de vendas. E a de pagamentos?



SIM
a tabela Vendas tem a chave primaria no campo ID
as outras tabelas tem o Campo REF, que e relacionado com o campo ID da tabela vendas
Relacionamento de um para muitos
(um registro da tabela vendas pode ter vários ref nas demais tabelas)
KERPLUNK 27/04/2022 13:09:39
#499728
Nesse caso use join natural(LEFT).
MFLAVIO 27/04/2022 14:25:17
#499730
Citação:

:
Nesse caso use join natural(LEFT).


na verdade eu ja tinha testado com o letf outer join
a esqueci de falar a Base de dados e Firebird 2.5
 select 
sub_venda.produto,
venda.data,
venda_pgto.valor,
venda.id
from sub_venda
right outer join venda on (sub_venda.ref = venda.id)
right outer join venda_pgto on (venda.id = venda_pgto.ref)
where
(
(venda.status = "Finalizado")
and
(venda_pgto.tpag = "PIX.")
and
(venda.data between "04/01/2022" and "04/26/2022")
)


e mesmo com o Left ou Right continua duplicando o campo Valor da tabela de pagamentos

sempre apresenta o valor da tabela pagamentos, para cada linha da tabela Sub_venda
KERPLUNK 27/04/2022 17:00:29
#499732
Faz um recorte dos dados e posta aqui, daí faço um fiddle pra mostrar.
MFLAVIO 28/04/2022 09:39:57
#499740
Citação:

:
Faz um recorte dos dados e posta aqui, daí faço um fiddle pra mostrar.


já agradeço de ante mão

essa e a consunta que estou tentando

 select 
venda_pgto.valor,
venda.data,
sub_venda.produto,
venda.id
from sub_venda
inner join venda on (sub_venda.ref = venda.id)
inner join venda_pgto on (venda.id = venda_pgto.ref)
where
(
(venda.status = "Finalizado")
and
(venda.data between "04/01/2022" and "04/26/2022")
and
(venda_pgto.tpag = "PIX.")
)

em anexo uma imagem do resultado

nas duas primeiras linhas (ID 15175) ja da para entender
esse ID 15175 e uma Venda que teve 2 itens(campo Produto) e 1 pagamento no valor de R$ 2130,00
no retorno da consulta o valor R$ 2130,00 aparece para cada produto
o que acaba duplicando o valor quando eu somo o total do campo valor

o que eu preciso e que o campo Valor seja apresentado apenas 1 vez, Ja tentei com right outer / Lefth Outer
Tópico encerrado , respostas não são mais permitidas