MySQL查询以计算平均价格,直到股票价值达到0

时间:2019-02-24 12:37:17

标签: mysql

我有两个MySQL表要使用,但是不幸的是,这个问题超出了我的知识范围。

第一张表显示了我拥有的产品ID和数量的库存

id    PID   Quantity
1      5       8
2      45      7
3      125     0

第二张表存储了我为购买库存商品所做的购买订单。

id      Date      PO ID    PID    Price    Purchased Quant.
1       1.1.19    PO1      5      8.00     7
2       1.1.19    PO1      45     2.15     9
3       2.1.19    PO2      5      4.45     6

因此,我想获得自最近购买日期算起的每PID的平均价格。

PID    Average Price
5      5.3375
45     2.15

对于PID'5'我有8个库存,我发现在2.1.19上购买了6个,价格为4,45€。因此,我需要在较旧的购买中再找到2件,在1.1.19上可以找到8.00€。

Average price calculation -> (6pcs * 4.45€ + 2pcs * 8.00€)/8pcs = 5.3375€

对于PID 45,计算应相同,但是我的库存已完全满足第一个订单的要求。

有什么办法可以通过查询在MySQL中解决此问题。

1 个答案:

答案 0 :(得分:0)

在8.0之前的MySQL版本中,这不容易实现。您可以使用在查询执行期间会发生变化的变量来做到这一点,但是请注意,没有任何书面记录可以保证变量分配的顺序符合预期。

现在我已经给出了免责声明,这是您可以使用的查询:

select   pid,
         sum(price * take)/sum(take) avg_price
from     (
          select   pid,
                   price,
                   @quantity := if(@pid = pid, @quantity, available) needed,
                   least(@quantity+0, quantity) take,
                   @quantity := @quantity - least(@quantity, quantity),
                   @pid := pid
          from     (select     o.*, 
                               p.quantity available 
                    from       orders o
                    inner join products p
                            on p.pid = o.pid
                    order by   o.pid,
                               o.date desc) data,
                   (select @pid := -1,
                           @quantity := 0) vars
          order by   pid, date desc) base
group by pid

fiddle

以更可靠的方式,您最好迁移到可以使用窗口函数的MySQL。