计算具有可变价格的购买成本

时间:2019-02-04 09:14:31

标签: mysql

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

例如,这可能发生:

  • 2018-10-01:您要购买6件“产品1”,每件$ 10.00,然后将它们放入库存。

  • 2018-10-04:客户想要2个“ Product1”项目。您将进入您的库存,出售2件商品,每件售价10.00美元。

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

  • 2018-11-06:客户想要7个“ Product1”项目。您将进入您的库存,出售4件以每笔$ 10.00的价格购买的商品和3件以$ 8.00的价格购买的商品。

  • 2018-12-01:您要购买4件“产品1”,每件$ 12.00。

  • 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

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

1 个答案:

答案 0 :(得分: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;

计算每次销售的成本。在开始时,我定义了一个包含要出售物品数量的变量。此变量将在每一行中进行操作。内部SELECTLEFT 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 |

希望它会有所帮助:)