Mysql 使用不同的价格计算采购成本

Mysql 使用不同的价格计算采购成本,mysql,Mysql,假设你有一家商店和一只股票。您以不同的价格购买产品,并希望计算每次销售的成本。问题是,购买价格不是固定的,您可能会进行销售,其中您销售的商品来自不同的购买,购买价格是混合的。成本的计算应该遵循“先进先出”的原则:你首先要出售库存中最旧的商品 例如,这可能会发生: 2018-10-01:您将以每件10美元的价格购买6件“产品1”,并将其放入您的库存中 2018-10-04:一位客户想要两件“产品1”。你将进入你的股票,卖出2件物品,每件10美元 2018-11-01:您将以每件8美元的价格购买8

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

例如,这可能会发生:

  • 2018-10-01:您将以每件10美元的价格购买6件“产品1”,并将其放入您的库存中

  • 2018-10-04:一位客户想要两件“产品1”。你将进入你的股票,卖出2件物品,每件10美元

  • 2018-11-01:您将以每件8美元的价格购买8件“产品1”,并将其放入您的库存中

  • 2018-11-06:一位客户想要7项“产品1”。你将进入你的股票,卖出4件你花10美元买的东西和3件你花8美元买的东西

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

  • 2018-12-10:一位客户想要6项“产品1”。你将进入你的股票,卖出5件你花8.00美元买的东西和1件你花12.00美元买的东西

因此,尝试将其放在两个表中:

表:采购

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语句计算是否/如何可能?我必须承认,我甚至不知道如何从这里开始或尝试什么。

首先,我添加了一个名为
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 |
如果需要,您可以使用
触发器填写此表,也可以手动填写。
现在我使用这个脚本:

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;
计算每次销售的成本。在开始时,我定义了一个变量,其中包含要销售的商品数量。此变量将在每一行中进行操作。内部
选择
是一个
左外部联接
,用于获取按日期订购的每次采购的库存中的项目数量,以便首先使用最旧的项目(FIFO)

第二个
选择
立即使用库存项目,并逐行减少变量,直到不再需要更多项目。您只需对
totalPrice
列进行
SUM
即可获得成本

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

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 |
并且设置@toSell:=5

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

希望有帮助:)

计算必须在纯MySQL中完成吗?没有PHP,C++,JavaScript等等?哇,非常感谢!我需要一些时间来测试一下,然后再给你回复。