2017-06-08的ID为4022的产品成本为1110,但2017-07-25的成本为1094.这令人困惑.我无法获得每种产品的确切成本.
我写了一个PHP算法,它循环遍历所有订单和采购订单,并使用最旧的成本到最新的成本.但该算法具有非常高的时间复杂度.这可以只使用mySQL查询吗?
请检查以下场景:
公司在第1天创建了产品X的采购订单:数量3,成本10.
客户购买2件产品X售价:第1天12件(库存中仍有1件,成本10件)
公司为产品X创建了采购订单:数量4,成本9.第2天
客户购买3件产品X售价:第2天12件
客户购买2件产品X售价:第3天12件
公司在第3天创建了产品X的采购订单:数量2,成本11.
客户购买2件产品X售价:第3天12件
那个报告:
第1天:
卖2件产品X买12,成本10,利润:2 *(12 – 10)
第2天:
出售3件产品X为12件,1件成本为10件,2件成本为9件,
利润:1 *(12 – 10)2 *(12 – 9)
第3天:
卖2件产品X买12,成本9,利润:2 *(12 – 9)
卖2件产品X买12,成本11,利润:2 *(12 – 11)
因此,新销售产品的利润使用其相应的成本计算.希望你明白我的意思.
数据库结构:
4个产品来自数据库
产品购买以上产品的订单
要实现此目的,您需要执行两个查询:
sql:
SELECT SUM(row_total) sale_total_cost,SUM(quantity_ordered) sale_total_number FROM sales_order_item soi JOIN sales_order so ON soi.sales_order_id=so.id WHERE so.purchase_date<'2017-06-07 15:03:30' AND soi.product_id=4160;
>第二个知道你买了多少产品
sql:
SELECT SUM(pop.cost * pop.quantity) purchase_total_price,SUM(pop.quantity) purchase_total_number FROM purchase_order_products pop JOIN purchase_order po ON pop.purchase_order_id=po.id WHERE po.created_at<'2017-06-07 15:03:30' AND pop.product_id=4160;
>在2017-02-01 14:23:35,产品4160的价格是:
(purchase_total_price – sale_total_cost)/(purchase_total_number – sale_total_number)
问题是你的“sales_order”表在2017-02-01 14:23:35开始,而你的“purchase_order”表在2017-06-07 08:55:48开始.因此,只要您无法从一开始就跟踪所有购买,结果就会不连贯.
编辑:
如果您可以修改表结构,并且只对将来的销售感兴趣.
添加purchase_order_products表中销售的商品数量
您必须修改purchase_order_products以获得每种产品的消耗:
更改表`purchase_order_products`添加列sold_items INT DEFAULT 0;
初始化数据
为了使其工作,您必须使sold_items列反映您的真实库存
您应该使用以下请求初始化表
更新`purchase_order_products` SET sold_items =数量;
然后使用您的每个产品的确切库存手动更新表格(这意味着quantity_ordered-sold_items必须反映您的实际库存.
这只需要进行一次.
将购买价格添加到sales_order_item表
ALTER TABLE sales_order_item ADD total_purchase_price INT DEFAULT NULL
输入新的销售订单
输入新的销售订单时,您必须使用以下命令获取包含剩余项目的最早的采购订单:
SELECT * FROM`sourcing_order_products` WHERE quantity!= sold_items其中product_id = 4160 ORDER BY`seasure_order_id` LIMIT 1;
然后,您将增加sold_items值,并计算总购买价格(总和)以填充total_purchase_price列.
计算保证金
可以使用sales_order_item表中row_total和total_purchase_price之间的差异轻松计算保证金