当存在“NULL”时排除整个组

时间:2013-10-02 15:57:25

标签: sql group-by null

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

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'的值并给出一个不准确的结果。

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

2 个答案:

答案 0 :(得分:0)

使用WHERE子句

从SELECT语句中删除NULL值
WHERE NOT ActualEnd IS NULL

答案 1 :(得分:0)

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

Having  COUNT(OrderNo) = COUNT(ActualEnd)

检查是否存在的子查询也有效,但根据查询和表格可能会变得缓慢而混乱。