我有一份零件清单的现有数量表。我有第二张表,其中包含一系列订单发货日期和所需数量。
我想要退回下一个订单的发货日期,我们将不再有库存。
例如:
表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进行分组并减去库存以获得Qty-Want,但我不知道如何获得下一个未发现订单的下一个发货日期。
A部分的前两个订单我们有库存,我想知道我们没有足够的第三个订单,到期为11/20/17,我们应该做13个部分来满足所有剩余的需求。< / p>
答案 0 :(得分:1)
您可以使用和窗口函数按“名称”计算运行总计,并观察它变为负数:
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
排序答案 1 :(得分:1)
如果您有可用的窗口功能(SQL Server或MySQL 8及更高版本),请使用以下查询:
Sub MultiDelete()
With Application
.ScreenUpdating = False
.DisplayAlerts = False
End With
Range("A1").Activate 'change to suit the column containing the names
Dim MultiDelete
MultiDelete = Array("Name1", "Name2", "Name3") 'put as many names as you like in the array
Dim G As Variant
While ActiveCell.Value <> ""
G = Filter(MultiDelete, ActiveCell.Value)
If UBound(G) <> -1 Then
Selection.EntireRow.Delete
Else
ActiveCell.Offset(1, 0).Activate
End If
Wend
With Application
.ScreenUpdating = True
.DisplayAlerts = True
End With
End Sub
demo - 适用于SQL 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
答案 2 :(得分:1)
这种方法涉及在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);
创建视图后,分别查询“Next Due”和“Qty-Want”的最早日期和最晚日期:
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
返回,因为它实际上不需要订购任何库存。