纸飞机

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  22 随笔 :: 28 文章 :: 30 评论 :: 0 Trackbacks

问题:对某列进行聚集运算,但该列的值可为空,由于函数会忽略NULL值,能否保持聚集运算的准确性令人担忧。例如,想要求DEPTNO 30中职员的平均佣金,但有些职员不挣佣金(这些职员的COMM值为NULL)。由于聚集运算会忽略NULL,因此输出结果的准确性没有保障。在进行聚集运算时有时可能需要以某种方式将NULL值包括进来。

解决方案

使用COALESCE函数把NULL转换为0,这样在进行聚集时可以把它们包括进来:

1   select avg(coalesce(comm,0)) as avg_comm

2     from emp

3    where deptno=30

讨论

请务必记住,在使用聚集函数时会忽略NULL。不使用COALESCE函数时该解决方案的输出如下:

select avg(comm)

   from emp

where deptno=30

AVG(COMM)

---------

       550

该查询表明,DEPTNO 30的平均佣金是550,快速检查这些行如下:

select ename, comm

   from emp

where deptno=30

order by comm desc

ENAME            COMM

---------- ---------

BLAKE

JAMES

MARTIN           1400

WARD              500

ALLEN             300

TURNER              0

这表明六个职员中只有四个职员挣得佣金。DEPTNO 30中所有佣金的总和是2200,其平均值应该是2200/6,而不是2200/4。如果不用COALESCE函数,回答的是问题“DEPTNO 30中挣得佣金的职员的平均佣金是多少?”,而不是“DEPTNO 30中所有职员的平均佣金是多少?”。使用聚集时记住要相应处理NULL值。

posted on 2008-05-14 21:47 纸飞机 阅读(351) 评论(0)  编辑  收藏 所属分类: Database

只有注册用户登录后才能发表评论。


网站导航: