根据平均购买率和销售率计算运营利润

时间:2017-11-26 06:42:00

标签: php mysql

我正在尝试从购买和销售中计算我的利润,产品库存数量和价值。 假设我的购买表为

enter image description here

和我的销售表格

enter image description here

目前我使用php成功完成了它。但由于我的购买和销售超过10万,它的工作进展非常缓慢。所以我需要一个mysql解决方案。下表描述了我的利润/库存计算方法。

enter image description here

  
      
  1. 合并购买和销售,然后按日期排序。
  2.   
  3. 余额库存价值仅取决于平均购买率,而非销售率。
  4.   
  5. 利润=(出售率 - 平均购买率)*出售数量
  6.   

所以当我接受2017-11-23的报告时,我需要得到

  
      
  • 利润= 602.38
  •   
  • 库存数量= 110
  •   
  • 股票价值= 9052.3806
  •   

这将是一个快速工作的方法来获得上述结果,一个简单的选择查询或使用存储过程/函数?如果它是一个简单的查询更好,应该怎么做?

1 个答案:

答案 0 :(得分:1)

到时候,您已经评论过想要每个Product_id的结果,我几乎完成了在给定时间范围内显示Net ProfitStock QuantityStock value的解决方案

因此,无论如何我都在这里分享我的方法,因为它可能对你或其他试图解决这个问题的人有所帮助。

<强>解决方案:

select
       final.profit,
       final.Balance_Stock_Quantity,
       final.Balance_Stock_Value
from
(
select tmp.date_,
       tmp.`Sale/Purchase`,
       tmp.product_id,
       tmp.quantity,
       tmp.rate,
       tmp.val,          
(
  case when tmp.`Sale/Purchase` = 'purchase' 
            then (@total_quant := @total_quant + tmp.quantity)
       else      (@total_quant := @total_quant - tmp.quantity)
  end
) as Balance_Stock_Quantity,
(
  case when tmp.`Sale/Purchase` = 'purchase' 
            then (@total_val := @total_val + tmp.val)
       else      (@total_val := @total_val - (@total_rate*tmp.quantity))
  end
) as Balance_Stock_Value,
(
  case when tmp.`Sale/Purchase` = 'purchase' 
            then (@total_rate := @total_val/@total_quant) 
       else @total_rate
  end
) as Balance_Stock_Rate,
(
  case when tmp.`Sale/Purchase` = 'sale' 
            then (@profit := (tmp.rate - @total_rate)*tmp.quantity) 
       else @profit
  end
) as profit

from
(
(select p_date as date_,
       'Purchase' as `Sale/Purchase`,
       p_product_id as product_id,
       p_quantity as quantity,
       p_rate as rate,
       (p_quantity * p_rate) as val
from purchase
where p_date BETWEEN '2017-11-23 00:00:00' AND '2017-11-23 05:00:00'
)
union all
(select s_date as date_,
       'Sale' as `Sale/Purchase`,
       s_product_id as product_id,
       s_quantity as quantity,
       s_rate as rate,
       (s_quantity * s_rate) as val
from sales
where s_date BETWEEN '2017-11-23 00:00:00' AND '2017-11-23 05:00:00' 
)
)tmp
cross join
(select 
        @total_quant := 0,
        @total_val := 0,
        @total_rate := 0, 
        @profit := 0) r
order by tmp.date_
)final
order by final.date_ desc
limit 1
;

DEMO

注1:我开始很兴奋地解决这个问题,因为我发现这是一个具有挑战性的问题,但最后我觉得我基本上做了同样的事情。已完成某些编程语言(例如,case...when之类的任务,并使用变量来维护ProfitQuantity等的之前的值。

所以我真的不确定,这会比你现在的方法有效,但我想这仍然值得一试。

注2:如果您的目标是显示每个产品的利润,库存和价值,我认为您应该坚持使用当前的方法。

尽管如此,如果您为{{1}中的每件商品存储Total quantityRateTotal value(在问题的第二张图片中显示),这将使您的任务变得简单}和Purchase表本身。计算并存储这些值,同时在这些表中插入其他值,如果它对您来说实惠。当您为最终报告编写查询时,这将节省大量时间和精力。

希望它有所帮助!