sql计数不匹配

时间:2012-08-03 10:12:57

标签: sql oracle

我无法理解SQL查询输出:

SQL> select distinct(STATUS) from TMP_ORDER_ACTION_PSTN_CP_11035;

    InDelivery_SOMBe 
    In Delivery
    Complete
    Amended
    Cancelled
    Failed InComplete
 1   SQL> select count(*) from TMP_ORDER_ACTION_PSTN_CP_11035 where
    STATUS='Complete';
          1484
 2   SQL>  select count(*) from TMP_ORDER_ACTION_PSTN_CP_11035 where STATUS
    != 'Complete';
          3167
  3  SQL> select count(*) from TMP_ORDER_ACTION_PSTN_CP_11035;
          5091

1和2查询的计数总和应与总计数(3查询)相同。为什么总和与整数不同? 这似乎是一个转储问题,但我不知道为什么会发生这种情况。 请注意,我的问题根本与空检查无关。就是这样 sum(1 + 2)= 3.1484 + 3167!= 5091.为什么结果不同?

3 个答案:

答案 0 :(得分:4)

我的猜测是NULL值,它们不匹配任何WHERE子句,包括最后一个。尝试

select count(*) from TMP_ORDER_ACTION_PSTN_CP_11035 where STATUS is null;

where status = null永远不会是真的,where null = null也不是。您必须使用is null

  

1和2查询的计数总和应与总计数(3查询)相同。为什么总和与整数不同?

不,因为带有NULL的记录与查询1或查询2不匹配,但它们在查询3中计算。

1 + 2 + IS NULL应该等于3.

答案 1 :(得分:4)

WHERE STATUS = NULL无效。没有什么等于NULL

尝试使用IS代替= ...

select count(*) from TMP_ORDER_ACTION_PSTN_CP_11035 where STATUS IS null

答案 2 :(得分:0)

试试这个:

假设p_key是表的主键,

select count(p_key) from TMP_ORDER_ACTION_PSTN_CP_11035 where STATUS='Complete';
select count(p_key) from TMP_ORDER_ACTION_PSTN_CP_11035 where STATUS <> 'Complete';
select count(p_key) from TMP_ORDER_ACTION_PSTN_CP_11035 ;