【问题标题】:MySQL Query to calculate average price until stock value reaches 0MySQL查询以计算平均价格,直到库存价值达到0
【发布时间】:2019-02-24 12:37:16
【问题描述】:

我有两个我想使用的 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 件库存,我发现 6 件在 2.1.19 以 4.45 欧元的价格购买。因此,我需要在 1.1.19 上以 8.00 欧元的价格购买旧商品中的另外 2 件。

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

对于 PID 45,计算应该是相同的,但是我的库存完全满足第一个 PO。

有什么方法可以在 MySQL 中通过查询解决这个问题。

【问题讨论】:

  • 你有哪个 MySQL 版本? SELECT VERSION();
  • 版本 5.6.38-nmm1-log
  • 抱歉雷蒙德,我不明白你的意思。因此,5.3375€ 的价格应该是正确的。我只有 8 件 PID “5” 库存。上次我以 4.45 欧元的价格购买了 6 件这篇文章。所以我只剩下 2 件,无法以我最近的购买价格计算。因此,我需要找到我购买此产品的第二次最新购买,以完成剩余的两件,价格为 8.00 欧元
  • 啊,我们开始了。第二张桌子不是我卖的,而是我买的。
  • 对,我将购买与出售这个词联系起来,我认为我需要完全醒来并喝一些(非常)浓咖啡,然后才能在 stackoverflow 上帮助其他人,我猜……

标签: mysql


【解决方案1】:

在 MySQL 8.0 之前的版本中,这并不容易实现。您可以使用在查询执行期间更改的变量来完成此操作,但请注意,没有书面保证可以保证变量分配的顺序与预期一致。

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

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。

【讨论】:

  • 或 MariaDB 10.2。
猜你喜欢
  • 1970-01-01
  • 2011-08-25
  • 1970-01-01
  • 2020-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多