SQL para saber o lucro dos produtos

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;

Aqui em baixo o retorno desta consulta:

Boa noite, para saber o lucro você precisa saber os preços de compra e venda, além da quantidade. Existem esses valores no seu banco?

1 curtida

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?

1 curtida

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
1 curtida

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.

Por causa da virgula após o FROM PRODUTO P, :joy: retire-a que eu ajustei acima…

Falha minha foi mal :joy:

1 curtida

Deu certo muito obrigado. :grinning:

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.

Talvez ele pode estar repetindo a qtde ao somar… includa isso no select e veja se iguala aquelas consultas que você mostrou…

SELECT 
  ...
  COUNT(DISTINCT X.VEN_COD) AS ITENS_VENDIDOS,
  COUNT(DISTINCT Y.COM_COD) AS ITENS_COMPRADOS
FROM ...

Mais provável é você ter linhas duplicadas na tabela produto… isso faz as tabelas de venda e compra errarem a qtde… faça essa query pra testar…

SELECT PRO_COD, PRO_DESCRICAO, COUNT(*) AS QTDE 
FROM PRODUTO WHERE PRO_COD = 12

Se trouxer mais de 1 você precisa limpar os registros duplicados…

1 curtida

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: