2014-10-26 75 views
0

满足销售订单的第一次出现我有两个表:SQL查询来计算不受股市

  1. 销售订单(SO)与领域:第一部分,DUE_DATE,数量
  2. 部分与场部和股票。

我试图编写一个查询,它将产生第一次出现(按日期 - SO.Due_Date)销售订单(SO.Qty)不能由股票满足的情况。

这是容易的,如果没有现货,即Part.Stock = 0或如果只有一个销售订单的部分(SO.Qty> Part.Stock)

如果有多个销售订单,我只想要显示第一个例如

Part.Part = Box , Part.Stock = 250 
SO.Part | SO.Due_Date | SO.Qty 
Box  | 26/10/2014 | 100 
Box  | 27/10/2014 | 100 
Box  | 28/10/2014 | 100 * Return this row 
Box  | 29/10/2014 | 100 

我想我需要一个子查询或需要使用CTE,但我不能解决它,除非我使用循环。这些表有成千上万的零件和销售订单,我试图尽快运行这个查询。

非常感谢您的帮助

+1

您正在使用哪个数据库管理系统? Postgres的?甲骨文? – 2014-10-26 21:02:31

+0

我不明白。您想要分组的列数,为什么'28/10/2014'行是所需的行?这不是第一行。 – 2014-10-26 21:11:41

回答

0

我想这是一个学习的过程,因为没有实际的业务会以这种方式工作。 总之,这里是一个查询到你想要的东西:

select * 
from sales_order as so1 
where due_date = 
(select min(due_date) 
    from sales_order as so2 
    inner join part as p on p.part = so2.part 
    where so1.part = so2.part 
    and stock < (
    select sum(quantity) 
    from sales_order as so3 
    where so3.due_date <= so2.due_date 
    and so3.part = so2.part 
    ) 
) 

我已经投入工作小提琴这里:http://sqlfiddle.com/#!2/bd8ab5/1 有一些假设每日期,例如一个订单,但我相信它回答的问题。

+0

非常感谢您的答案,并在SQL小提琴上显示。它工作完美。 – PurbeckPlodder 2014-10-27 11:51:44

0

使用自加入计算量运行总每一行,并与具有运行总计超过p.stock更大最小的到期日选择行查询

select so.part, so.due_date, so.quantity 
from sales_order so 
join part p on p.part = so.part 
join sales_order so2 on so2.part = so.part 
    and so2.due_date <= so.due_date 
where p.part = 'Box' 
group by so.part, so.due_date, so.quantity 
having sum(so2.quantity) > max(p.stock) 
order by so.due_date limit 1 
+0

感谢您的贡献。我会尝试你的建议,但可能需要编辑许多不同的部分,而不仅仅是“盒子”。我无法在开发系统(我的笔记本电脑)上试用它,因为上周末他的女朋友扔下楼梯时,老板刚把它拿走了。我明天可能会收回我的! – PurbeckPlodder 2014-10-27 11:56:18