日期:2014-05-17  浏览次数:20913 次

oracle查询为空时的问题,在线等
有一个表名为com 表字段和内容如下
id name bols
1 a 40
2 b 50
3 c  
4 d  
现问:select bols ,count(bols) from com group by bols;
为什么会输出

40 1
50 1
  0

,我想的是,在输出结果为空时,应该是为3的呀,
大家帮我看下为什么,thanks

------解决方案--------------------
不论你有多少数据,count(null)永远是0

------解决方案--------------------
分组子句是根据你的提供的分组关键字段,进行分组,如果有相同的则为一组,显示为一行,因为你的分组关键字段只有一个,就是bols ,又因为 bols可分为3个 40、50
和空。
但:


COUNT(*) 返回组中项目的数量,这些项目包括 NULL 值和副本。

COUNT(ALL expression) 对组中的每一行都计算 expression 并返回非空值的数量。

COUNT(DISTINCT expression) 对组中的每一行都计算 expression 并返回唯一非空值的数量。
------解决方案--------------------
想要都列出来 可以判断下空值nvl()或者decode()都行


------解决方案--------------------
count(null)只返回0,可以用NVL先转换NULL
SQL code
WITH t AS (
SELECT  'a'NAME,40 bols FROM dual
UNION ALL 
SELECT 'b',50 FROM dual
UNION ALL 
SELECT 'c',NULL FROM dual
UNION ALL
SELECT 'd',NULL FROM dual
)
SELECT bols,Count(Nvl(bols,0)) FROM t GROUP BY bols;

------解决方案--------------------
探讨

5楼的,
1 count(null)只返回0,为什么只返回0?
2 这样写可以吗,select bols ,count(nvl(bols,' ')) from com group by nvl(bols,' ');