【OCGP】COUNT[通常情况下利用count进行计算行数的时候,对指定字段的不会将null值计算在内]select count(null)
--结果
/*消息 8117,级别 16,状态 1,第 1 行
操作数数据类型 void type 对于 count 运算符无效。*/[原因分析]:
[首先做个有趣的实验:]
declare @i int
Set @i = null
print isnull(@i,0)
select count(@i)
--=================结果
/*0*/[通过实验我们可以看出,实际上对应select count(null)的报错,是说名count内的表达是不符合运算符要求。是一个非法的类型。
当即与一个合法类型后,count(@i) 就可以进行计数。][同理:]
Select count(case when 0=1 then 1 else null end); 
--结果
/*0*/--=================实际示例:
select  workorder_id 
from projects 
group by workorder_id 
having count(*) 
=  COUNT(case when step_nbr=0 and step_status='c' then 1 else NULL end) 
  + COUNT( case when step_nbr <>0 and step_status='w' then 1 else NULL end);[可以理解为null值会被count所忽略进行处理] 个人理解,如有偏颇之处,还请指正!

解决方案 »

  1.   

    select count(cast(null as int))
    -----------
    0
    警告: 聚合或其他 SET 操作消除了空值。(1 行受影响)
      

  2.   

    Select count(case when 0=1 then 1 else null end); 
    /*-----------
    0
    警告: 聚合或其他 SET 操作消除了空值。(1 行受影响)
    */
      

  3.   

    Select count(case when 0=1 then 1 else null end);
    [SQL Server 2005 4035]
    /*
    执行结果:
    -----------
    0
    警告: 聚合或其他 SET 操作消除了空值。(1 行受影响)
    */
      

  4.   

    Select count(case when 0=1 then 1 else null end); 
    你看执行计划,
    case when 0=1 then 1 else null end是先将这个作为了一个列,然后再COUNT(列)所以没问题
      

  5.   

    我也可以的
    --Microsoft SQL Server 2005 - 9.00.3042.00