Boa noite pessoal, tenho a seguinte consulta onde está mostrando a qtde de venda e qtde de compra. Eu gostaria de saber em como eu posso fazer o lucro em cima desta consulta ou alguma outra forma de fazer. Alguém pode me ajudar??
Segue a consulta:
select
p.pro_cod,
p.pro_descricao,
(select sum( x.itv_qtde ) from itensvenda x inner join venda x1 on x1.ven_cod = x.ven_cod where x.pro_cod = p.pro_cod) as qtd_venda,
(select sum( y.itc_qtde ) from itenscompra y inner join compra y1 on y1.com_cod = y.com_cod where y.pro_cod = p.pro_cod) as qtd_compra
from produto p;
Bom dia, existem sim para ambos. Na tabela de itensvenda tem itv_valorcusto que é o valor de venda e na tabela de itenscompra também a mesma coisa, itc_valorcusto que é o valor da compra do produto.
Há duas situações: Vamos supor que foi pago um valor X por 100 unidades de um produto, e foram vendidos 40 no valor Y.
1 - Você que saber o lucro em cima do total? Ou seja, se foi vendido 40, quantos de lucro há em cima de todos os 100 comprados.
2 - Você quer saber o lucro em cima dos 40 vendidos? Ou seja, pegar o valor de compra de 40 unidades, e o valor de venda de 40 unidades, e verificar quanto foi obtido de lucro.
Acredito que você esteja querendo a situação 2.
Então você pode fazer o seguinte:
quantidade vendida x preço de compra = preço pago na compra
quantidade vendida x preço de venda = preço pago na venda
Com esses dois valores, você saberá que o “preço pago na compra” equivale a 100%, então pode aplicar uma regra de 3:
preço pago na compra - 100%
preço pago na venda - quantos?
O cálculo ficaria assim:
Preço pago na venda * 100 = preço pago na compra * x
Logo: x = (Preço pago na venda * 100) / preço pago na compra
Vê se isso da certo:
SELECT
P.PRO_COD,
P.PRO_DESCRICAO,
COMPRA.QTD_COMPRA AS QUANTIDADE_COMPRADA,
VENDA.QTD_VENDA AS QUANTIDADE_VENDIDA,
(COMPRA.PRECO_TOTAL_COMPRA - ((VENDA.PRECO_TOTAL_VENDA * 100) /
COMPRA.PRECO_TOTAL_COMPRA) AS LUCRO
FROM PRODUTO P,
(SELECT SUM( X.ITV_QTDE ) AS QTD_VENDA,
SUM(X.ITV_VALORCUSTO) AS PRECO_TOTAL_VENDA
FROM ITENSVENDA X INNER JOIN VENDA X1
ON X1.VEN_COD = X.VEN_COD
WHERE X.PRO_COD = P.PRO_COD) AS VENDA,
(SELECT SUM( Y.ITC_QTDE ) AS QTD_COMPRA,
SUM(Y.ITC_VALORCUSTO) AS PRECO_TOTAL_COMPRA
FROM ITENSCOMPRA Y INNER JOIN COMPRA Y1
ON Y1.COM_COD = Y.COM_COD
WHERE Y.PRO_COD = P.PRO_COD) AS COMPRA
Obs: Apenas não entendi porque você está fazendo um SUM( Y.ITC_QTDE ), você tem várias linhas de um mesmo produto, comprado em preços diferentes?
Obrigado por estar me auxiliando, isto mesmo tenho várias linhas de um mesmo produto, comprado em preços diferentes. Rodei este script, coloquei apenas from produto p em duas linhas onde o mesmo não estava encontrando o P. O resultado acabou ficando igual para todos os produtos.
Talvez esteja assim por falta de agrupamento ou justamente por usar subqueries (select dentro de outro)… faz sentido você fazer join de venda com venda e de compra com compra para depois você vinculá-los ao produto ao invés de fazê-los diretamente?
Em questões de desempenho evite e opte por inner join e group by…
SELECT
P.PRO_COD,
P.PRO_DESCRICAO,
SUM(Y.ITC_QTDE) AS QTDE_COMPRADA,
SUM(X.ITV_QTDE) AS QTDE_VENDIDA,
(SUM(Y.ITC_VALORCUSTO) - ((SUM(X.ITV_VALORCUSTO) * 100) / SUM(Y.ITC_VALORCUSTO)) AS LUCRO
FROM PRODUTO P
INNER JOIN ITENSVENDA X ON X.PRO_COD = P.PRO_COD
INNER JOIN ITENSCOMPRA Y ON Y.PRO_COD = P.PRO_COD
GROUP BY P.PRO_COD, P.PRO_DESCRICAO
Sim ficaria bem melhor, como é a primeira vez que faço isso estou tendo um pouco de dificuldade, deu erro no inner join e acabei adicionando mais um ) antes do AS LUCRO.
Uma coisa que eu achei estranha é que eu acho que ele deve estar trazendo os valores errado, ou seja, qtdes a mais. Fiz um sum de qtde de um determinado produto e não está batendo com o outro. Dê uma olhada na imagem abaixo que eu fiz um print.
Compreendi, adicionei as duas linhas de comandos a mais e fiz a limpeza das tabelas. Neste último script ele trouxe apenas 1. No primeiro itens_vendidos = 13 e itens_comprados 3. Segue a imagem: