首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >返回剩余行的SQL

返回剩余行的SQL
EN

Stack Overflow用户
提问于 2017-11-13 19:57:52
回答 3查看 93关注 0票数 3

我有一张手头上的零件清单的数量表。我有第二张表,上面有一系列的订单、装运日期和所需数量。

我想退回下一次订单的装运日期,我们将不再有库存。

例如:

表1,A、B和C部分的手头数量:

代码语言:javascript
复制
Name   Qty-Have
A      10
B      10
C      5

表2,A、B和C部分未来两个月的订单:

代码语言:javascript
复制
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

结果,当我们的库存不足时,最早的订货日期:

代码语言:javascript
复制
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部分,以满足所有剩余的需求。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-11-13 20:20:27

如果您有可用的窗口函数( Server或MySQL 8及更高版本),请使用以下查询:

代码语言:javascript
复制
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及更高版本

结果

代码语言:javascript
复制
Name    Next Due    Qty-Want
----------------------------------
A       11/20/17    13
B       12/29/17    2
C       11/10/17    2
票数 1
EN

Stack Overflow用户

发布于 2017-11-13 20:13:14

您可以使用求和窗口函数按“名称”计算正在运行的总数,并观察其为负值的位置:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2017-11-13 23:06:22

此方法涉及在MySQL中创建视图。该视图包含未来库存的滚动累积和。从总数中减去当前的数量-拥有库存。因此,某些行将具有负值,并使用HAVING子句消除它们:

代码语言:javascript
复制
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”:

代码语言:javascript
复制
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返回,因为它实际上不需要订购任何库存。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47272505

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档