我有两张桌子:
我试图编写一个查询,该查询将产生第一次出现(按日期 - 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,但除非我使用循环,否则我无法解决问题。这些表包含数千个零件和销售订单,我正在尝试尽快运行此查询。
非常感谢你的帮助
答案 0 :(得分: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 有一些假设,例如每个日期一个订单,但我相信它回答了这个问题。
答案 1 :(得分: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