用于计算库存未满足的销售订单的第一次出现的SQL查询

时间:2014-10-26 21:00:17

标签: sql

我有两张桌子:

  1. 带有字段的销售订单(SO):Part,Due_Date,Qty
  2. 部分与字段部分和股票。
  3. 我试图编写一个查询,该查询将产生第一次出现(按日期 - 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,但除非我使用循环,否则我无法解决问题。这些表包含数千个零件和销售订单,我正在尝试尽快运行此查询。

    非常感谢你的帮助

2 个答案:

答案 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