我有一张手头上的零件清单的数量表。我有第二张表,上面有一系列的订单、装运日期和所需数量。
我想退回下一次订单的装运日期,我们将不再有库存。
例如:
表1,A、B和C部分的手头数量:
Name Qty-Have
A 10
B 10
C 5表2,A、B和C部分未来两个月的订单:
Name Due Qty-Need
A 11/10/17 4
A 11/15/17 6
A 11/20/17 3
A 11/25/17 10
B 11/12/17 4
B 12/15/17 4
B 12/29/17 4
C 11/10/17 7结果,当我们的库存不足时,最早的订货日期:
Name Next Due Qty-Want
A 11/20/17 13
B 12/29/17 2
C 11/10/17 2 我知道我可以做一组表2,并减去库存,以获得数量需求,但我不知道如何获得下一个未发现订单的下一个装运日期。
我们有库存的A部分的前两份订单,我想知道我们没有足够的时间应付第三批订单,第11/20/17号到期,我们应该制造13部分,以满足所有剩余的需求。
发布于 2017-11-13 20:20:27
如果您有可用的窗口函数( Server或MySQL 8及更高版本),请使用以下查询:
select h.name Name, min(o.due) Next_Due, max(o.sumQty) - h.Qtyhave Qty_Want
from
(
select *, sum(QtyNeed) over (partition by name order by due) sumQty
from orders
) o
right join onHand h on o.name = h.name and o.sumQty > h.Qtyhave
group by h.name, h.Qtyhave 演示 -适用于Server以及MySQL 8及更高版本
结果
Name Next Due Qty-Want
----------------------------------
A 11/20/17 13
B 12/29/17 2
C 11/10/17 2发布于 2017-11-13 20:13:14
您可以使用求和窗口函数按“名称”计算正在运行的总数,并观察其为负值的位置:
select ord.name,
ord.due,
ord.qty,
q.qty - ord.ord_sum inventory
from ( select *,
sum(qty) over (partition by name order by Due) ord_sum
from fut_orders ) ord
inner join quantity q
on ord.name = q.name由ord.name,ord.due订购
发布于 2017-11-13 23:06:22
此方法涉及在MySQL中创建视图。该视图包含未来库存的滚动累积和。从总数中减去当前的数量-拥有库存。因此,某些行将具有负值,并使用HAVING子句消除它们:
CREATE OR REPLACE VIEW future_orders AS
(SELECT
t2.name,
t2.due,
t1.qty_have as qty_have,
t2.qty_need,
(SELECT SUM(fo.qty_need) FROM table_2 fo WHERE fo.name = t2.name AND fo.due <= t2.due)-qty_have as qty_want
FROM table_2 t2
LEFT JOIN table_1 t1 ON t1.name = t2.name
HAVING qty_want > 0);创建视图后,分别查询最早日期和最新日期,分别查询“下一个到期日期”和“Qty- date”:
SELECT
t1.name,
(SELECT fo.due FROM future_orders fo WHERE fo.name = t1.name ORDER BY fo.due ASC LIMIT 1) as 'Next Due',
(SELECT fo.qty_want FROM future_orders fo WHERE fo.name = t1.name ORDER BY fo.due DESC LIMIT 1) as 'Qty-Want'
FROM table_1 t1
WHERE 1;这给你的结果,你正在寻找:下一个装运日期的下一个订单将被发现,再加上数量所需的满足所有剩余的需求。“c”作为NULL返回,因为它实际上不需要订购任何库存。
https://stackoverflow.com/questions/47272505
复制相似问题