【问题标题】:Sql query to calculate first occurrence of a sales order not fulfilled by stockSql 查询以计算第一次出现的销售订单未按库存完成
【发布时间】:2014-12-22 01:28:43
【问题描述】:

我有两张桌子:

  1. 具有以下字段的销售订单 (SO):Part、Due_Date、Qty
  2. 带有字段 Part 和 Stock 的零件。

我正在尝试编写一个查询,该查询将产生第一次出现(按日期 - 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,但除非我使用循环,否则我无法解决。这些表有数千个零件和销售订单,我正在尝试尽快运行此查询。

非常感谢您的帮助

【问题讨论】:

  • 您使用的是哪个 DBMS?后格雷斯?甲骨文?
  • 我不明白。您要按哪一列分组,为什么 28/10/2014 行是所需的行?这不是第一行。

标签: sql


【解决方案1】:

使用自联接计算每行的运行数量总计并选择运行总计大于 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

【讨论】:

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

我认为这是一个学习练习,因为没有真正的企业会以这种方式运作。 无论如何,这里有一个查询来做你想做的事:

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 有一些假设,例如每个日期一个订单,但我相信它回答了这个问题。

【讨论】:

  • 非常感谢您的回答和在 SQL fiddle 上的展示。效果很好。
猜你喜欢
  • 2019-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多