SQL查询-未在下一个预期日期发货的订单

SQL查询-未在下一个预期日期发货的订单,sql,sql-server,Sql,Sql Server,我正在努力回答一个问题。我需要能够显示未发货的未完成订单 订单项目可以有一个日期,客户在该日期之前期待该项目。这可以是空的 我有下列表格 销售订单 SalesOrderItem 装运 装运项目 一个销售订单项目可以有多个与其相关的装运项目,以进行拆分装运 我需要一份未完成订单的清单,以及每个订单的下一个预期日期。我很挣扎,因为我不确定这样做最经济的方式 我可以选择所有已计算ShippedQty

我正在努力回答一个问题。我需要能够显示未发货的未完成订单

订单项目可以有一个日期,客户在该日期之前期待该项目。这可以是空的

我有下列表格

销售订单

SalesOrderItem

装运

装运项目

一个销售订单项目可以有多个与其相关的装运项目,以进行拆分装运

我需要一份未完成订单的清单,以及每个订单的下一个预期日期。我很挣扎,因为我不确定这样做最经济的方式

我可以选择所有已计算ShippedQty 我需要查询的列是:

查询结果


任何提示都值得欣赏。

我认为最经济的方法是在SalesOrder和SalesOrderItem表中添加一个状态字段。然后,您可以在计算发货数量之前从查询中删除大部分订单。当数据随时间增长时,这将是一个更大的好处。状态可以是一个布尔标志,用于标记已完成或已完全发货的订单。

使用CTE和subselect的简单方法可以是

WITH cte as
(select SalesOrderID , Min(DateExpected) DateExpected 
    from SalesOrderItem o group by SalesOrderId, SalesOrderItem
    having sum(Qty) <> (select COALESCE(sum(qty),0) from ShipmentItem s where s.SalesOrderItem = o.SalesOrderItem) )

select SalesOrderId, Min(DateExpected) DateExpected from cte
group by SalesOrderId
请随意使用和修改提琴,以改进您的问题

但马克B有一个整数,表示已完成销售订单的boolen标志
这很好,但这样的查询可能有助于将销售订单标记为周期性完成…

这似乎表达了您想要的逻辑:

select SalesOrderId,
       min(case when soi.qty > si.qty then soi.dateExpected end) as min_expected_date
from salesOrder so left join
     salesOrderItem soi
     on soi.SalesOrderId = soi.SalesOrderId left join
     (select si.SalesOrderItemId, sum(qty) as shipped_qty
      from ShipmentItem si
      group by si.SalesOrderItemId,
     ) si
     on si.SalesOrderItemId = soi.SalesOrderItemId
group by so.SalesOrderId;

我会努力使逻辑正确——也许会对样本数据进行测试,以确保它是正确的。然后,如果性能有问题,您可以进行优化。

请编辑您的问题并添加示例数据以及预期结果。您能告诉我添加示例数据的最佳方法吗?感谢您理想地将表脚本化为CREATETABLE语句,只包含问题所需的列,并将示例数据作为insert添加到。。。值,这将使某人很容易复制您的结果并提供解决方案。我认为您错过了SalesOrderItem中的SalesOrderId您是对的,Turo。我现在已经添加了它。不幸的是,我从来没有弄明白SQL FIDLE或如何使用StackOverflow编辑器发布表结构。我将不得不回到绘图板上。谢谢你,马克。谢谢你的评论。我总是被告知要避免这样的事情,因为在添加项目、删除,更改数量等。出现错误的机会太多了。您好,steve_c123,您需要自己权衡利弊,但我要说的是,快速查找未结订单所节省的成本,尤其是数据库随着时间的推移而增长时,将超过添加标志设置功能(检查具体的订单已经满足,并适当地设置了标志我想你可能是对的,马克。看看性能优势,花额外的时间编码是值得的。这是最快的解决方案。非常感谢,图罗。
ShipmentId (PK)  
ShipmentItemId (PK)  
ShipmentId (FK)  
SalesOrderItemId (FK)  
Qty
SalesOrderId  
NextDateExpected (Date or NULL)
WITH cte as
(select SalesOrderID , Min(DateExpected) DateExpected 
    from SalesOrderItem o group by SalesOrderId, SalesOrderItem
    having sum(Qty) <> (select COALESCE(sum(qty),0) from ShipmentItem s where s.SalesOrderItem = o.SalesOrderItem) )

select SalesOrderId, Min(DateExpected) DateExpected from cte
group by SalesOrderId
select SalesOrderId,
       min(case when soi.qty > si.qty then soi.dateExpected end) as min_expected_date
from salesOrder so left join
     salesOrderItem soi
     on soi.SalesOrderId = soi.SalesOrderId left join
     (select si.SalesOrderItemId, sum(qty) as shipped_qty
      from ShipmentItem si
      group by si.SalesOrderItemId,
     ) si
     on si.SalesOrderItemId = soi.SalesOrderItemId
group by so.SalesOrderId;