我正在尝试生成一个报告,从下面的数据库中计算保证金.问题是产品的成本(存在于purchase_order_products表中)可能会发生变化.
2017-06-08上ID为4022的产品成本为1110,但2017-07-25的成本为1094.这令人困惑.我无法获得每种产品的确切成本.
我写了一个PHP算法,它循环遍历所有订单和采购订单,并使用最旧的成本到最新的成本.但该算法具有非常高的时间复杂度.这可以只使用mysql查询吗?
请检查以下场景:
公司在第1天为产品X创建了采购订单:数量3,成本10.
客户购买2件产品X售价:第1天12件(库存中仍有1件,成本10件)
公司在第2天为产品X创建了采购订单:数量4,成本9.
客户购买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个产品来自数据库
产品购买以上产品的订单
为什么不放轻松并在订单表中添加一个利润列,该列表是在客户购买产品时实时计算的.这样,您可以仅根据销售订单计算您的损失,因为这是实际的已经以某种方式计算以产生销售价格.当然,这仅适用于未来的销售,但您可以使用现有代码进行少量修改,以填充旧记录的利润列,并且您将在更新之前仅对旧事务运行此代码一次.
详细说明:
更改表格"sales_order"添加"profit"列.这样,您可以使用其他相关列来计算总和,(total_paid, total_refund, total_due, grand_total)因为您可能希望通过在计算中根据需要包含这些货币字段来更好地控制报表,例如生成报表时total_payed仅使用排除tota_due或将其包含在不同类型的报表中,换句话说,您只能从此表生成多种报告类型,而不会通过仅添加此列来压倒数据库系统.
编辑:
您还可以向此表添加成本列以便快速检索,并最大限度地减少对其他表的连接和查询,如果您想更进一步,可以为报告添加专用表,这将非常有用.从上个月生成缺失报告并检查旧订单状态.
给定时间对象的价格由以下公式给出:“股票总价/股票总数”。
为此,您需要执行两个查询:
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;
Run Code Online (Sandbox Code Playgroud)
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;
Run Code Online (Sandbox Code Playgroud)
2017-02-01 14:23:35为:(购买总价格 - 销售总成本) / (购买总数量 - 销售总数量)
问题是您的“sales_order”表从 开始2017-02-01 14:23:35,而您的“purchase_order”表从 开始2017-06-07 08:55:48。因此,只要您无法从一开始就跟踪所有购买情况,结果就会不一致。
编辑:
purchase_order_products添加表中销售的商品数量您必须修改purchase_order_products才能获得每种产品的消耗量:
ALTER TABLE `purchase_order_products` ADD COLUMN sold_items INT DEFAULT 0;
为了使其正常工作,您必须使 sell_items 列反映您的真实库存
您应该使用以下请求初始化您的表
UPDATE `purchase_order_products` SET sold_items=quantity;
然后使用每种产品的确切库存手动更新表格(这意味着Quantity_ordered-sold_items 必须反映您的真实库存。
此操作只需执行一次。
ALTER TABLE sales_order_item ADD total_purchase_price INT DEFAULT NULL
当您输入新的销售订单时,您必须使用以下命令获取包含剩余项目的最早的采购订单:
SELECT * FROM `purchase_order_products` WHERE quantity!=sold_items where product_id=4160 ORDER BY `purchase_order_id` LIMIT 1;
然后,您必须增加 sell_items 值,并计算总购买价格(总和)以填充total_purchase_price 列。
通过 sales_order_item 表中 row_total 和total_purchase_price 之间的差值可以轻松计算出利润
| 归档时间: |
|
| 查看次数: |
1055 次 |
| 最近记录: |