SUBQUERY COM JOIN ME MATANDO
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!
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.
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
codCadastro | codVenda | codProduto | valVendido | Qtde
01 | 210 | 50 | 10,00 | 2
02 | 210 | 80 | 25,00 | 1
03 | 220 | 50 | 5,00 | 3
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
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
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?
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?
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
dessa forma
codVenda valor
210 105,00
220 15,00
ao todo, na tblVendidos há quase 20 mil registros, e leva quase 2 min para processar todos