我正在尝试从购买和销售中计算我的利润,产品库存数量和价值。 假设我的购买表为
和我的销售表格
目前我使用php成功完成了它。但由于我的购买和销售超过10万,它的工作进展非常缓慢。所以我需要一个mysql解决方案。下表描述了我的利润/库存计算方法。
- 合并购买和销售,然后按日期排序。
- 余额库存价值仅取决于平均购买率,而非销售率。
- 利润=(出售率 - 平均购买率)*出售数量
醇>
所以当我接受2017-11-23的报告时,我需要得到
- 利润= 602.38
- 库存数量= 110
- 股票价值= 9052.3806
这将是一个快速工作的方法来获得上述结果,一个简单的选择查询或使用存储过程/函数?如果它是一个简单的查询更好,应该怎么做?
答案 0 :(得分:1)
到时候,您已经评论过想要每个Product_id
的结果,我几乎完成了在给定时间范围内显示Net Profit
,Stock Quantity
和Stock 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
;
注1:我开始很兴奋地解决这个问题,因为我发现这是一个具有挑战性的问题,但最后我觉得我基本上做了同样的事情。已完成某些编程语言(例如,case...when
之类的任务,并使用变量来维护Profit
,Quantity
等的之前的值。
所以我真的不确定,这会比你现在的方法有效,但我想这仍然值得一试。
注2:如果您的目标是显示每个产品的利润,库存和价值,我认为您应该坚持使用当前的方法。
尽管如此,如果您为{{1}中的每件商品存储Total quantity
,Rate
和Total value
(在问题的第二张图片中显示),这将使您的任务变得简单}和Purchase
表本身。计算并存储这些值,同时在这些表中插入其他值,如果它对您来说实惠。当您为最终报告编写查询时,这将节省大量时间和精力。
希望它有所帮助!