SQL返回剩余的行

时间:2017-11-13 19:57:52

标签: mysql sql sql-server

我有一份零件清单的现有数量表。我有第二张表,其中包含一系列订单发货日期和所需数量。

我想要退回下一个订单的发货日期,我们将不再有库存。

例如:

表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>

3 个答案:

答案 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返回,因为它实际上不需要订购任何库存。