2

我有一个看起来像这样的表:

OrderNo | Operation | PlannedStart |PlannedEnd | ActualStart | ActualEnd | OpComplete
   1    |      1    |   01/02/13   |  01/03/13 |    01/03/13 |  01/03/13 |    True
   1    |      2    |   01/03/13   |  01/04/13 |    01/04/13 |  01/05/13 |    True
   2    |      1    |   01/01/13   |  01/02/13 |    01/01/13 |  01/02/13 |    True
   2    |      2    |   01/02/13   |  01/03/13 |    01/02/13 |  01/03/13 |    True
   3    |      1    |   01/01/13   |  01/02/13 |    01/01/13 |  01/02/13 |    True
   3    |      2    |   01/02/13   |  01/03/13 |    01/02/13 |    NULL   |    False

和一个看起来像这样的查询:

SELECT   
    OrderNo, 
    MIN(PlannedStart) AS PlannedStart, 
    MAX(PlannedEnd) AS PlannedEnd,    
    MIN(ActualStart) AS ActualStart, 
    MAX(ActualEnd) AS ActualEnd, 
    DATEDIFF(hour, MIN(PlannedStart), MAX(PlannedEnd)) AS PlannedThroughput, 
    DATEDIFF(hour, MIN(ActualStart), MAX(ActualEnd)) AS ActualThroughput 
FROM Operations 
GROUP BY OrderNo 
ORDER BY ActualThroughput Desc

我试图找出完成订单所需的实际时间(将其所有操作的总时间相加),然后能够将其与计划时间进行比较。

该代码采用第一次操作的开始日期和最后一次操作的结束日期,它计算差异并将其作为小时数提供给我。

当订单中的操作尚未完成时会出现问题,然后将“NULL”显示为实际结束。Null 不是我可以与 MAX() 函数一起使用来计算 ActualThroughput(参见代码)的值,因此它采用最后一个不是“NULL”的值并给我一个不准确的结果。

我希望能够完全排除所有尚未完成的订单(组)。我怎样才能做到这一点?

4

2 回答 2

0

只需使用 WHERE 子句从 SELECT 语句中删除 NULL 值

WHERE NOT ActualEnd IS NULL
于 2013-10-02T16:03:25.207 回答
0

想要立即删除整个组指向使用 HAVING。然后,您需要选择一个聚合函数,它可以让您区分具有空值的组和没有空值的组。没有太多需要查看的内容,并且它们中的大多数都以一种使它们几乎不可见的方式处理空值,这除了在计数的情况下没有用处。计数不包括空值意味着您可以通过将已知的非空列与您担心的列进行比较来使用它。在这种情况下:

Having  COUNT(OrderNo) = COUNT(ActualEnd)

检查是否存在的子查询也可以工作,但根据查询和表的不同,可能会变得缓慢而混乱。

于 2018-04-19T16:42:03.787 回答