SUBQUERY COM JOIN ME MATANDO

POCE1DON 12/07/2015 16:44:08
#448701
Todo novato sofre viu...
Será que você pode me ajudar?

Basicamente a estrutura está formada assim:

tblVendas:
codCadastro | Data
210 | 01/02/2000
220 | 02/01/2000

tblVendidos:
codCadastro | codVenda | codProduto | valVendido | Qtde
01 | 210 | 50 | 10,00 | 2
02 | 210 | 80 | 25,00 | 1
03 | 220 | 50 | 5,00 | 3

tblPagamentos:
codCadastro, codVenda, Valor
01 | 220 | 15,00

O que preciso saber é quais vendas existem para um determinado produto. Faço a query para localizar as vendas que tem produtos de
código [Ô]80[Ô], então preciso realizar a soma de todos os outros produtos que pertencem a cada uma das vendas encontradas, ou seja, na
venda [Ô]210[Ô] tem os produtos [Ô]50[Ô] e [Ô]80[Ô] que serão somados e terá um total de [Ô]45,00[Ô] e não só apenas o [Ô]80[Ô] com o valor total de [Ô]25,00[Ô].
Após isso tenho que fazer um JOIN em tblPagamentos e saber se o total vendido é mesmo do valor recebido e definir a situação da venda.

A forma como estou fazendo, as vendas estão se repetindo na listagem.

Me ajuda?

Desde já, obrigado pela leitura!
JABA 12/07/2015 18:30:50
#448705
Você poderia agrupar pelo codigo da venda da seguinte maneira:

SELECT codvenda, sum(valVendido * Qtde) as valor FROM tblvendidos group by codVenda;

Essa consulta traria os seguintes dados:

codVenda Valor
210 45,00
220 15,00

Ou você poderia colocar uma restrição somente para os produtos que desejar, dessa maneira:

SELECT codvenda, sum(valVendido * Qtde) as valor FROM tblvendidos where codProduto = 80 group by codVenda;

Essa consulta traria os seguintes dados:

codVenda Valor
210 25,00

Você poderia tirar o agrupamento também, daí ficaria assim mudando o codigo do produto para 50, conforme o teu exemplo:

SELECT codvenda, sum(valVendido * Qtde) as valor FROM tblvendidos where codProduto = 50;

Essa consulta traria os seguintes dados:

codVenda Valor
210 35,00

Teste aí, qualquer coisa nos dê um toque.
POCE1DON 12/07/2015 18:56:16
#448706
Citação:

:
Você poderia agrupar pelo codigo da venda da seguinte maneira:

SELECT codvenda, sum(valVendido * Qtde) as valor FROM tblvendidos group by codVenda;

Essa consulta traria os seguintes dados:

codVenda Valor
210 45,00
220 15,00

Ou você poderia colocar uma restrição somente para os produtos que desejar, dessa maneira:

SELECT codvenda, sum(valVendido * Qtde) as valor FROM tblvendidos where codProduto = 80 group by codVenda;

Essa consulta traria os seguintes dados:

codVenda Valor
210 25,00

Você poderia tirar o agrupamento também, daí ficaria assim mudando o codigo do produto para 50, conforme o teu exemplo:

SELECT codvenda, sum(valVendido * Qtde) as valor FROM tblvendidos where codProduto = 50;

Essa consulta traria os seguintes dados:

codVenda Valor
210 35,00

Teste aí, qualquer coisa nos dê um toque.



Certo Jaba, até aí tudo bem. Na explicação que fiz, tentei ser o mais resumido possível, e realmente fez entender que era assim o problema como vc explicou, lhe agradeço mas o problema é outro.

Vou precisar buscar as vendas informando o código do produto e data de realização, ou seja, o SELECT precisa haver um SUM(valVendido * Qtde) de tblVendidos sem filtrar apenas o produto que especifiquei. O produto que informei na busca, será apenas para localizar as vendas que possuí esse produto, mas todos os outros pertencentes deverão também ser somados para se obter o valor total da venda e assim realizar o JOIN em tblPagamentos e conferir se o valor existe e apresentar como uma venda recebida ou não.

Dessa forma, está realizando a soma apenas do produto informado de código 7

SELECT VE.codCadastro, Venda.Data, SUM(Venda.Vendido) AS Vendido, PG.Valor AS Recebido, VI.codProduto
FROM (
SELECT
VE.codCadastro, FORMAT(VE.Data,[ô]DD/MM/YYYY[ô]) AS Data, (VI.valVenda * VI.Qtde) AS Vendido, PG.Valor, VI.codProduto
FROM
(
(
tblVendas AS VE
LEFT JOIN tblVendidos AS VI
ON VE.codCadastro = VI.codVenda
)
LEFT JOIN tblPagamentos AS PG
ON PG.codVenda = VE.codCadastro
)

GROUP BY VE.codCadastro, VI.codProduto, VE.Data, (VI.valVenda * VI.Qtde), PG.Valor
ORDER BY VE.codCadastro
) AS Venda
WHERE VI.codProduto = 7
GROUP BY VE.codCadastro, VI.codProduto, Venda.Data, PG.Valor

JABA 12/07/2015 19:16:37
#448707
Ok.Só pra entender melhor, e se o codigo do produto fosse 50, como ficaria a saída seguindo os dados abaixo:

codCadastro | codVenda | codProduto | valVendido | Qtde
01 | 210 | 50 | 10,00 | 2
02 | 210 | 80 | 25,00 | 1
03 | 220 | 50 | 5,00 | 3
POCE1DON 12/07/2015 19:33:19
#448709
boa pergunta! isso aí que é o problema!
Nesse caso, as 2 vendas devem ser listadas
tanto a venda 210 como a 220 tem o produto de código 50

o valor total da venda 210 é 45,00 e a venda 220 seu valor total é 15,00
então as 2 vendas devem ser listadas com seus devidos valores totais exibidos
com base no valor unitário X quantidades vendidas, mas isso
é para acontecer em todos os produtos pertencentes à venda e não só aquele que
busco, certo?
o produto que busco é apenas para encontrar as vendas que possuí ele como vendido


JABA 12/07/2015 19:47:40
#448710
Para as consultas abaixo, estou me baseando no produto de código 50 conforme a tabela de exemplo.

SELECT sum(valVendido * Qtde) as valor FROM tblvendidos where codVenda in ( select codVenda from tblvendidos where codProduto = 50);

Saída:

valor
60,00

Ou

SELECT codVenda, sum(valVendido * Qtde) as valor FROM tblvendidos where codVenda in ( select codVenda from tblvendidos where codProduto = 50) group by codVenda;

Saída:

codVenda Valor
210 45,00
220 15,00

JABA 12/07/2015 20:40:01
#448713
Vamos nos concentrar somente na parte da venda por enquanto. Deixa a parte do pagamento para depois.

codCadastro | codVenda | codProduto | valVendido | Qtde
01 | 210 | 50 | 10,00 | 2
02 | 210 | 80 | 25,00 | 1
03 | 220 | 50 | 5,00 | 3
04 | 210 | 30 | 15,00 | 4
05 | 150 | 40 | 20,00 | 5

De acordo com as consultas que expus no último comentário, elas só não trarão os dados do codCadastro = 05 seguindo tabela acima. Sendo assim, sem o agrupamento pelo codVenda, a saída será 120, pois pegará o valor vendido do codCadastro 01, 02, 03 e 04. Agora com o agrupamento, a saída será:

codVenda valor
210 105,00
220 15,00

é isso que está precisando?
POCE1DON 12/07/2015 23:46:34
#448720
Citação:

:
Vamos nos concentrar somente na parte da venda por enquanto. Deixa a parte do pagamento para depois.

codCadastro | codVenda | codProduto | valVendido | Qtde
01 | 210 | 50 | 10,00 | 2
02 | 210 | 80 | 25,00 | 1
03 | 220 | 50 | 5,00 | 3
04 | 210 | 30 | 15,00 | 4
05 | 150 | 40 | 20,00 | 5

De acordo com as consultas que expus no último comentário, elas só não trarão os dados do codCadastro = 05 seguindo tabela acima. Sendo assim, sem o agrupamento pelo codVenda, a saída será 120, pois pegará o valor vendido do codCadastro 01, 02, 03 e 04. Agora com o agrupamento, a saída será:

codVenda valor
210 105,00
220 15,00

é isso que está precisando?



Desculpe pela minha demora Jaba, mas é que a rede de energia caiu e só voltou agora.

Sim, é isso mesmo que preciso.
Identificar as vendas pelo código do produto, realizar a soma (unitário x quantidade) de todos os produtos que pertencem a ela, e como disse, depois a gente ve
a questão do pagamento.


Essa query está me retornando todas as vendas que possuí
vendido o produto conforme o codigo especificado

SELECT VE.codCadastro
FROM tblVendas AS VE
LEFT JOIN
tblVendidos AS VI ON VE.codCadastro = VI.codVenda
WHERE VI.codProduto = 7
GROUP BY VE.codCadastro

Isso não é útil pra gente montar toda a query que irá fazer a soma
total como vc já entendeu que devo fazer?
JABA 13/07/2015 00:05:17
#448721
Você chegou a testar as consultas abaixo? Elas fazem exatamente o que especifiquei no último exemplo.

SELECT sum(valVendido * Qtde) as valor FROM tblvendidos where codVenda in ( select codVenda from tblvendidos where codProduto = 50);

Saída:

valor
60,00

Ou

SELECT codVenda, sum(valVendido * Qtde) as valor FROM tblvendidos where codVenda in ( select codVenda from tblvendidos where codProduto = 50) group by codVenda;

Saída:

codVenda Valor
210 45,00
220 15,00
POCE1DON 13/07/2015 00:16:26
#448722
Testei sim, mas está fazendo uma soma geral, de todas as vendas juntas e não
dessa forma

codVenda valor
210 105,00
220 15,00
POCE1DON 13/07/2015 00:18:36
#448723
e há outro detalhe, a consulta leva um bom tempo para retornar
ao todo, na tblVendidos há quase 20 mil registros, e leva quase 2 min para processar todos
Página 1 de 4 [40 registro(s)]
Tópico encerrado , respostas não são mais permitidas