假设您有一家商店和一家股票。您正在购买价格不同的产品,并希望计算每次销售的成本。问题是购买价格不固定,您可能会在销售中以不同的购买价格出售不同购买的商品。成本应以一种“先进先出”的原则进行计算:您首先出售库存最老的物品。
例如,这可能发生:
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中进行计算?我不得不承认我什至不知道如何从这里开始或尝试什么。
答案 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;
计算每次销售的成本。在开始时,我定义了一个包含要出售物品数量的变量。此变量将在每一行中进行操作。内部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 |
希望它会有所帮助:)