【问题标题】:Calculate costs from purchases with variant prices计算不同价格的采购成本
【发布时间】:2019-02-05 13:45:09
【问题描述】:

假设您有一家商店和一家库存。您正在以不同的价格购买产品,并希望计算每次销售的成本。问题是购买价格不是固定的,您可能会在销售中销售来自不同购买的物品,购买价格混合。成本应该按照一种“先进先出”的原则计算:您首先出售库存中最旧的商品。

例如,这可能会发生:

  • 2018-10-01:您以每件 10.00 美元的价格购买了 6 件“Product1”并将它们放入您的库存中。

  • 2018-10-04:客户想要 2 件“Product1”。您将进入您的库存并出售您以每件 10.00 美元购买的 2 件商品。

  • 2018-11-01:您以每件 8.00 美元的价格购买了 8 件“Product1”并将它们放入您的库存中。

  • 2018-11-06:客户想要 7 件“Product1”。您将进入库存并出售 4 件以每件 10.00 美元购买的物品和 3 件以每件 8.00 美元购买的物品。

  • 2018-12-01:您以每件 12.00 美元的价格购买了 4 件“Product1”。

  • 2018-12-10:客户想要 6 件“Product1”。您将进入库存并出售 5 件以每件 8.00 美元购买的商品和 1 件以 12.00 美元购买的商品。

因此尝试将其放入 2 个表中:

表格:购买

purchase | product | amount | purchase price per item|       date |
      1          1        6                     10.00   2018-10-01
      2          1        8                      8.00   2018-11-01
      3          1        4                     12.00   2018-12-01

表格:销售额

sale | product | amount |      date | costs
   1         1        2   2018-10-04     ??
   2         1        7   2018-11-06     ??
   3         1        6   2018-12-10     ??

sales.costs 中的值应该是:

Sale 1: 2*10.00 = 20.00
Sale 2: 4*10.00 + 3*8.00 = 64.00
Sale 3: 5*8.00 + 1*12.00 = 52.00

如果/如何在 MySql 5.6 中使用 UPDATE 语句进行计算,有什么想法吗?我不得不承认我什至不知道如何从这里开始或尝试什么。

【问题讨论】:

  • 必须在纯MySQL中计算?没有 PHP、C++、Javascript 之类的?

标签: mysql


【解决方案1】:

首先,我添加了一个名为stock 的新表。在这张表中,我存储了库存的每一个变化。它看起来像这样:

purchase | sold |       date |
       1 |    2 | 2018-10-04 |
       1 |    4 | 2018-11-06 |
       2 |    3 | 2018-11-06 |
       2 |    5 | 2018-12-10 |
       3 |    1 | 2018-12-10 |

您可以根据需要使用TRIGGER 或手动填写此表。 现在我使用这个脚本:

SET @toSell:=5;
SELECT s.stock, p.price, LEAST( s.stock, @toSell ) AS toSell , @toSell * p.price AS totalPrice, @toSell := @toSell - LEAST( s.stock, @toSell ) AS stillNeeded
FROM (
    SELECT p.purchase, SUM( s.sold ) AS  'sold', p.amount, IFNULL( p.amount - SUM( s.sold ) , p.amount ) AS  'stock'
    FROM purchases AS p
    LEFT OUTER JOIN stock AS s ON p.purchase = s.purchase
    GROUP BY p.purchase
    ORDER BY p.date
) AS s
RIGHT OUTER JOIN purchases AS p ON s.purchase = p.purchase
WHERE s.stock >0 AND LEAST( s.stock, @toSell ) > 0;

计算每次销售的成本。在开始时,我定义了一个包含要出售的物品数量的变量。此变量将在每一行中进行操作。内部的SELECT 是一个LEFT OUTER JOIN,用于获取按日期订购的每次购买的库存中的物品数量,以首先使用最旧的物品(FIFO)。

第二个SELECT 现在使用库存项目并逐行减少变量,直到不再需要任何项目。您只需 SUM totalPrice 列即可获取费用。

为了测试脚本,我添加了一个新行/购买

purchase | product | amount | purchase price per item|       date |
       4 |       1 |     10 |                      5 | 2019-02-04 |

当您使用SET @toSell:=2 运行此脚本时,结果将如下所示:

stock | price | toSell | totalPrice | stillNeeded |
    3 |    12 |      2 |         24 |           0 |

还有SET @toSell:=5

stock | price | toSell | totalPrice | stillNeeded |
    3 |    12 |      3 |         60 |           2 |
   10 |     5 |      2 |         10 |           0 |

希望对你有帮助:)

【讨论】:

  • 哇,非常感谢!我需要一些时间来测试这个并回复你。
猜你喜欢
  • 2019-04-30
  • 2019-02-02
  • 1970-01-01
  • 1970-01-01
  • 2019-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多