SQL para saber o lucro dos produtos

11 respostas
postgresqlprogramaçãoswingjava
L

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:

11 Respostas

P

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?

L

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.

P

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?

L

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.

R

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
L

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.

R

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

Falha minha foi mal :joy:

L

Deu certo muito obrigado. :grinning:

L

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.

R

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…

L

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:

Criado 11 de setembro de 2017
Ultima resposta 15 de set. de 2017
Respostas 11
Participantes 3