CONSULTA COM JOIN EM 3 TABELAS. VALOR ERRADO

POCE1DON 19/05/2015 00:53:20
#446752
O que estou fazendo errado?

Tenho as tabelas Pagamento, Venda e Vendido

Basicamente as informações ficam armazenadas assim:

Em Pagamento, o valor que já está pago referente à venda.
Em Venda fica registrado quando foi realizada e o cliente
Em Vendido são os produtos referente à venda.

Tenho 1 cliente, esse possuí 1 venda, essa venda possuí vários produtos e também possuí vários pagamentos.

Preciso saber se há algum débito desse cliente, realizando a comparação do valor das suas compras com os pagamentos realizados.

Essa query não deu certo, os pagamentos estão sendo somados repetidos:

[Ô]SELECT SUM(VI.valVenda * VI.Qtde), SUM(PG.Valor) FROM (([Ô] & _
[Ô]Venda AS VE LEFT JOIN Vendidos AS VI ON VE.codCadastro = VI.codVenda) LEFT JOIN [Ô] & _
[Ô]Pagamento AS PG ON PG.codVenda = VE.codCadastro) [Ô] & _
[Ô]WHERE VE.codCliente = [Ô] & lngCodigoCliente, CNX, adOpenDynamic, adLockOptimistic

Exemplo:

Vendidos Venda 1:

1. 90,00
2. 140,00
3. 260,00

Apenas 1 pagamento de 490,00

Vendido Venda 2:

1. 1000

Apenas 1 pagamento de 1000,00

Com essa consulta, tenho 1490,00 de vendido (o que está correto) e 2470,00 de pagamento ( (490,00 x 3) + 1000 )
Há apenas 1 pagamento para cada venda, mas como a venda 1 tem 3 produtos vendidos, seu pagamento de 490,00 está sendo somado 3x

Pode me ajudar e me dizer o que de errado estou fazendo nessa query?

Obrigado!
LUIZCOMINO 19/05/2015 09:17:49
#446758
Resposta escolhida
amigão tente ai


[Ô] SELECT SUM(VI.valVenda * VI.Qtde), SUM(PG.Valor) FROM Venda AS VE,Vendidos AS VI,Pagamento AS PG [Ô] & _
[Ô] WHERE VE.codCadastro = VI.codVenda [Ô] & _
[Ô] AND PG.codVenda = VE.codCadastro [Ô] & _
[Ô] AND PG.codVenda = VI.codVenda [Ô] & _
[Ô] AND VE.codCliente = [Ô] & lngCodigoCliente, CNX, adOpenDynamic, adLockOptimistic
POCE1DON 19/05/2015 10:59:23
#446764
Luiz, ficou do mesmo jeito.

O valor de pagamento, sendo o total dos 3 produtos (490,00), está sendo realizado 3x

Vlw
LUIZCOMINO 19/05/2015 11:43:38
#446766
amigo passa a estrutura das tabelas essa referência está estranha

[Ô] AND PG.codVenda = VE.codCadastro [Ô]
não seria VE.codCadastro = VI.codCadastro

tente assim:



[Ô] SELECT SUM(VI.valVenda * VI.Qtde), SUM(PG.Valor) FROM Venda AS VE,Vendidos AS VI,Pagamento AS PG [Ô] & _
[Ô] WHERE VE.codCadastro = VI.codVenda [Ô] & _
[Ô] AND PG.codVenda = VI.codVenda [Ô] & _
[Ô] AND VE.codCliente = [Ô] & lngCodigoCliente, CNX, adOpenDynamic, adLockOptimistic
POCE1DON 19/05/2015 19:34:07
#446788
Certo amigo,

VE = tblVendas: codCadastro, codCliente, Data
VI = tblVendidos: codCadastro, codVenda, codProduto, valVendido
PG = tblPagamentos: codCadastro, codVenda, valPago

Basicamente seria assim:
Para vários pagamentos, existe apenas 1 venda. Para vários produtos vendidos, existe apenas 1 venda.
Para várias vendas, existe apenas 1 cliente.

Então, com base no código do cliente, preciso de todas as vendas realizadas à ele, com o total vendido e total dos pagamentos recebidos.

Obrigado mais uma vez!


DOUGLASJ 19/05/2015 22:31:35
#446792
Você tentou colocar um group by no final?

ex:

[Ô]SELECT SUM(VI.valVenda * VI.Qtde), SUM(PG.Valor) FROM (([Ô] & _
[Ô]Venda AS VE LEFT JOIN Vendidos AS VI ON VE.codCadastro = VI.codVenda) LEFT JOIN [Ô] & _
[Ô]Pagamento AS PG ON PG.codVenda = VE.codCadastro) [Ô] & _
[Ô]WHERE VE.codCliente = [Ô] & lngCodigoCliente & [Ô] group by PG.codVenda[Ô].

LUIZCOMINO 20/05/2015 09:21:13
#446802
tente agora amigo

[Ô] SELECT SUM(VI.valVenda * VI.Qtde), SUM(PG.Valor) FROM Venda AS VE,Vendidos AS VI,Pagamento AS PG [Ô] & _
[Ô] WHERE VE.codCadastro = VI.codCadastro [Ô] & _
[Ô] AND VE.codCadastro = PG.codCadastro [Ô] & _
[Ô] AND VI.codCadastro = PG.codCadastro [Ô] & _
[Ô] AND VI.codVenda = PG.codVenda [Ô] & _
[Ô] AND VE.codCliente = [Ô] & lngCodigoCliente, CNX, adOpenDynamic, adLockOptimistic
TUNUSAT 20/05/2015 11:58:28
#446809
POCE1DON,

Tentei montar a estrutura em Access para podermos entender melhor o problema.
Está anexo zipado (Consulta.accdb). Por favor, valide a estrutura.

[][ô]s,
Tunusat.
POCE1DON 21/05/2015 11:16:53
#446841
Citação:

:
Você tentou colocar um group by no final?

ex:

[Ô]SELECT SUM(VI.valVenda * VI.Qtde), SUM(PG.Valor) FROM (([Ô] & _
[Ô]Venda AS VE LEFT JOIN Vendidos AS VI ON VE.codCadastro = VI.codVenda) LEFT JOIN [Ô] & _
[Ô]Pagamento AS PG ON PG.codVenda = VE.codCadastro) [Ô] & _
[Ô]WHERE VE.codCliente = [Ô] & lngCodigoCliente & [Ô] group by PG.codVenda[Ô].



Tentei mas também foi sem sucesso.


Citação:

:
tente agora amigo

[Ô] SELECT SUM(VI.valVenda * VI.Qtde), SUM(PG.Valor) FROM Venda AS VE,Vendidos AS VI,Pagamento AS PG [Ô] & _
[Ô] WHERE VE.codCadastro = VI.codCadastro [Ô] & _
[Ô] AND VE.codCadastro = PG.codCadastro [Ô] & _
[Ô] AND VI.codCadastro = PG.codCadastro [Ô] & _
[Ô] AND VI.codVenda = PG.codVenda [Ô] & _
[Ô] AND VE.codCliente = [Ô] & lngCodigoCliente, CNX, adOpenDynamic, adLockOptimistic




Agora os valores foram retornados como NULL

Citação:

:
POCE1DON,

Tentei montar a estrutura em Access para podermos entender melhor o problema.
Está anexo zipado (Consulta.accdb). Por favor, valide a estrutura.

[][ô]s,
Tunusat.



Obrigado pelo apoio mas não deu certo também amigo.
A tabela Vendido, na coluna [Ô]codVenda[Ô] se tentar repetir o codCadastro de Venda, não aceita. O problema esta aí, já que em Vendido pode existir diversos registros em codVenda mas todos com o mesmo codCadastro de Venda



Já tô pra ficar maluco com esse treco. Uma estrutura tão simples e não dá certo hora nenhuma!
POCE1DON 21/05/2015 14:08:06
#446851
Consegui resolver a consulta pessoal

Segue a query que utilizei:

  
[Ô]SELECT SUM(VI.Vendido), SUM(PG.Valor) [Ô] & _
[Ô]FROM [Ô] & _
[Ô](((SELECT codVenda, SUM(valVenda * Qtde) AS Vendido FROM tblVendidos GROUP BY codVenda) AS VI [Ô] & _
[Ô]LEFT JOIN tblPagamentos AS PG ON PG.codVenda = VI.codVenda) [Ô] & _
[Ô]LEFT JOIN tblVendas AS VE ON VE.codCadastro = VI.codVenda) [Ô] & _
[Ô]WHERE VE.codCliente = [Ô] & CodigoCliente, CNX


Obrigado pessoal, valeu mesmo pela força!

Abrax!
Tópico encerrado , respostas não são mais permitidas