我正在尝试根据 FIFO 获得数量结果,下面有 2 个表格:
表购买:
| PO | Date | Quantity | Item |
|-------|--------------|----------|------|
| PO001 | 01-Jan-2016 | 3 | AO21 |
| PO002 | 10-Jan-2016 | 7 | AO21 |
| PO003 | 01-Feb-2016 | 3 | AO21 |
表库存:
| SO | Date | Quantity | Item |
|-------|-------------|----------|------|
| SO001 | 02-Jan-2016 | 2 | AO21 |
| SO002 | 11-Feb-2016 | 8 | AO21 |
| SO003 | 12-Feb-2016 | 6 | AO23 |
我希望输出是这样的:
| SO | PO | Quantity |
|-------|-------|----------|
| SO001 | PO001 | 2 |
| SO002 | PO001 | 1 |
| SO002 | PO003 | 7 |
您对查看此输出的查询有任何想法吗?从行中计算的 SO 和 PO 的结果。更多解释:
想要的结果中的 2、1、7 来自哪里?
从stock
和purchase
。item 的第一个(按日期)库存值为A021
2,而第一次购买 ( PO001
) 需要 3,所以 stock sold 2 并且我们在结果中得到这一行:
| SO001 | PO001 | 2 |
我们还需要购买 1 个,然后下一个库存值为 8。所以这次购买完成,我们得到 1 个(还有 7 个库存):
| SO002 | PO001 | 1 |
下一次购买 ( PO002
) 需要 7 个,而我们正好剩下 7 个,因此购买完成(该商品还剩下 0 个库存)。我们得到:
| SO002 | PO003 | 7 |
购买PO003
需要 3,但没有剩余库存,因此我们在该购买的结果中没有任何行。
这不是一个微不足道的问题,但使用窗口函数(以及 CTE 以提高可读性)不会很难。
MySQL 也没有实现,但让我们看看它是如何实现的:
在SQLFiddle测试(在 Postgres 中)。
请注意,MariaDB(可以替代 MySQL)已经宣布他们正在研究窗口函数和 CTE,可能在他们的下一个版本(10.2)上。请参阅MariaDB 10.2 发行说明。
对于当前的 MySQL 版本,它必须更复杂,但逻辑是相同的:
在SQLFiddle-2(在 MySQL 5.6 中)测试。