分组函数会自动忽略空值
NVL函数使分组函数无法忽略空值
select count(*),count(nvl(comm,0)) from emp;
nvl(comm,0)
如果comm不为空,返回comm
如果是空,返回0,就不会返回空
*******************************************************
SQL> select sum(sal)/count(*) 一,sum(sal)/count(sal) 二,avg(sal) 三
2 from emp;
一 二 三
---------- ---------- ----------
2073.21429 2073.21429 2073.21429
SQL> select sum(comm)/count(*) 一,sum(comm)/count(comm) 二,avg(comm) 三
2 from emp;
一 二 三
---------- ---------- ----------
157.142857 550 550
SQL> select count(*),count(comm) from emp;
COUNT(*) COUNT(COMM)
---------- -----------
14 4
SQL> select * from emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-12月-80 800 20
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30
7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30
7566 JONES MANAGER 7839 02-4月 -81 2975 20
7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30
7698 BLAKE MANAGER 7839 01-5月 -81 2850 30
7782 CLARK MANAGER 7839 09-6月 -81 2450 10
7788 SCOTT ANALYST 7566 19-4月 -87 3000 20
7839 KING PRESIDENT 17-11月-81 5000 10
7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30
7876 ADAMS CLERK 7788 23-5月 -87 1100 20
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
7900 JAMES CLERK 7698 03-12月-81 950 30
7902 FORD ANALYST 7566 03-12月-81 3000 20
7934 MILLER CLERK 7782 23-1月 -82 1300 10
已选择14行。
SQL> select count(*),count(nvl(comm,0)) from emp;
COUNT(*) COUNT(NVL(COMM,0))
---------- ------------------
14 14
null会导致计算错误,需要使用nvl函数转为非空值
select count(nvl(comm,0)) from emp;
注意:sum(comm)/count(*):统计的是所有人的平均值(含该项为null的人员)
sum(comm)/count(comm)&avg(comm)是统计comm非空的人员平均数
6.
nvl(a列,0),若a列有值则返回a列,否则返回0,即:将空值转换为0
avg(comm)=sum(comm)/count(comm)
avg(nvl(comm,0))=sum(comm)/count(*)
nvl(comm,0) 为空时返回0不为空时返回实际值
NVL函数忽视"虑空"功能;其实是一个替补函数
使用分组函数3
1、分组函数与空值
·分组函数会自动忽略空值
·举例1:统计员工的平均工资
select sum(sal)/count(*) 一,sum(sal)/count(sal) 二,avg(sal) 三 from emp;
·统计员工的平均奖金
select sum(comm)/count(*) 一, sum(comm)/count(comm) 二,avg(comm) 三 from emp;
2、在分组函数中使用NVL函数
*注意:NVL函数使分组函数无法忽略空值
select count(*),count(nvl(comm,0)) from emp;
分组函数自动忽略结果中的空值
要使空值不被忽略,使用nvl函数 nul(列名,返回值)(列为空就返回设置的返回值,不为空直接返回列中的值)
sun(comm)/count(*)=>count(*)包含没奖金的,表示加上空值的奖金字段
sun(comm)/count(comm)=>count(comm)不包含没奖金的,表示不加上空值的奖金字段,如果要加上空字段,count(nvl(comm,0),nvl表示空则把奖金的字段的值设置为0
avg(comm) =>不包含没奖金的,表示不加上空值的奖金字段,
select count(*),count(nvl(comm,0) from emp;
nvl()函数
NVL(表达式1,表达式2)
如果表达式1为空值,NVL返回值为表达式2的值,否则返回表达式1的值。 该函数的目的是把一个空值(null)转换成一个实际的值。其表达式的值可以是数字型、字符型和日期型。但是表达式1和表达式2的数据类型必须为同一个类型。
nvl使分组函数无法忽略空值
count(nvl(a,0))当第一个参数为空的时候,返回第二个参数
select count(*),count(nvl(a,0)) from emp;
/**********************************************
select deptno,wm_concat(ename) from emp group by deptno;
select deptno 部门号,wm_concat(ename) 部门中员工的姓名 from emp group by deptno;
set linesize 200
col 部门中员工的姓名 for a60
**********************************************/
统计员工的平均工资:
/**********************************************
select sum(sal)/count(*) 一,sum(sal)/count(sal) 二,avg(sal) 三、from emp;
**********************************************/
/**********************************************
select sum(comm)/count(*) 一,sum(comm)/count(comm) 二,avg(comm) 三、from emp;
**********************************************/
select count(*),count(comm) from emp;
分组函数会自动滤掉空值,可使用nvl函数屏蔽分组函数的滤空功能,nvl(arg1,arg2),单第一个参数为空则返回第二个自参数的值。
分组函数
avg,sum
select avg(sal),sum(sal) from emp ;
min,max
select min(sal),max(sal) from emp ;
count(...) 会自动忽略掉空值,如果不想忽略,可以使用关键字nvl
select count(nvl(comm,0)) from emp;
wm_concat ----行转列
直接使用avg分组函数则会忽略所查询字段中的null值,nvl函数可使分组函数无法忽略null值:avg(nvl(n,0)),第一个参数为空时返回第二个参数;
分组函数会自己过滤掉控制,所以count的话是计算出不包含空的数目,所以要统计的时候可以使用*或者是唯一性列,计算平均值的时候如果有空值也要用nvl或者使用sum和count来计算,因为avg也是会忽略掉空值的。
NVL函数:使函数无法忽略空值;
nvl使分组函数无法忽略空值
count(nvl(a,0))当第一个参数为空的时候,返回第二个参数
select count(*),count(nvl(a,0)) from emp;
分组函数计算时会自动过滤掉空值。
NVL是Oracle中的滤空函数,使用NVL函数使分组函数无法忽略空值
select count(nvl(comn,0))from emp;
nvl()把空值转换成一个非空的值
nvl使分组函数无法忽略空值
nvl函数是分组函数无法忽略空值