zoukankan      html  css  js  c++  java
  • 常用分组函数count-avg-sum-max-min

    分组函数也称多行函数,用于对一组数据进行运算,针对一组数据(取自于多行记录的相同字段)只返回一个结果,例如计算公司全体员工的工资总和、最高工资、最低工资、各部门的员工平均工资(按部门分组)等。由于分组函数实际上提供的是数据统计功能,因此也称统计函数。Oracle常用分组函数如下所示:
    常用分组函数
    函数    功能说明                    适用类型
    avg()    计算平均值                 数值型
    count() 返回查询所得到的记录行数 任何类型数据
    max()   计算最大值                     任何类型数据
    min()    计算最小值                     任何类型数据
    sum()   求和                              数值型
    SELECT avg(sal), max(sal), min(sal), sum(sal) FROM emp;
    SELECT max(hiredate), min(hiredate) FROM emp;
    SELECT max(ename), min(ename) FROM emp;
    对于字符型数据值,以字典顺序居后者为大;对于日期/时间型数据值,以较迟者为大;

    count函数的用法相对复杂一些,其语法格式包括如下三种。
    count(*) 返回组中总记录数目;
    count(exp) 返回表达式exp值非空的记录数目;
    count(DISTINCT(exp)) 返回表达式exp值不重复的、非空的记录数目。
    例如 ,下述SELECT语句分别实现了查询emp表中总记录行数(雇员总数)、查询comm字段值非空的记录行数(补助非空的雇员人数)、查询deptno字段值不重复且非空的记录行数(部门数目,当前共有编号分别为10、20和30的3个不同部门)等功能。
    SELECT count(*) FROM emp;
    SELECT count(comm) FROM emp;
    SELECT count(DISTINCT(deptno)) FROM emp;

    分组函数中的空值
    由于分组函数返回的结果是不是基于单行数据、而是基于行组(多行数据)计算所得到的,因此分组函数与单行函数差别较大,在空值数据的处理方面也是如此。除COUNT(*)以外的所有分组函数均忽略空值。例如下述语句:

    SELECT * FROM emp; 
    EMPNO	ENAME	JOB	MGR	 HIREDATE	SAL	 COMM	 DEPTNO
    7369	 SMITH	 CLERK7902	 1980/12/17	800.00	 20
    7499	 ALLEN	 SALESMAN7698	1981/2/20	1600.00	300.00	 30
    7521	 WARD	 SALESMAN7698	1981/2/22	1250.00	500.00	 30
    7566	 JONES	 MANAGER7839	1981/4/2	2975.00	 20
    7654	 MARTIN	SALESMAN7698	1981/9/28	1250.00	1400.00	30
    7698	 BLAKE	 MANAGER7839	1981/5/1	2850.00	 30
    7782	 CLARK	 MANAGER7839	1981/6/9	2450.00	 10
    7788	 SCOTT	 ANALYST7566	 1987/4/19	3000.00	 20
    7839	 KING	 PRESIDENT	 1981/11/17	5000.00	 10
    7844	 TURNER	SALESMAN7698	1981/9/8	1500.00	0.00	 30
    7876	 ADAMS	 CLERK	7788	 1987/5/23	1100.00	 20
    7900	 JAMES	 CLERK	7698	 1981/12/3	 30
    7902	 FORD	 ANALYST7566	 1981/12/3	3000.00	 20
    7934	 MILLER	CLERK	7782	 1982/1/23	1300.00	 10
    SELECT sum(comm), avg(comm) FROM emp; 
    SUM(COMM)	AVG(COMM)
    2200	 550
    SELECT COUNT(*),COUNT(COMM) FROM EMP;
    COUNT(*)	COUNT(COMM)
    14	 4
    

    从中可以看出,分组函数sum(comm)只是对不为空的comm字段值进行求和(300+500+1400+0),相当于过滤掉/忽略了所有comm字段值为空的记录行。avg(comm)的情况类似,其效果等价于sum(comm)/count(comm),而不是sum(comm)/count(*)。类似地,如果分组函数的参数为表达式(不是单一的字段),则忽略表达式结果中的空值,例如: 

    SELECT sum(sal), sum(comm), sum(sal+comm), sum(sal)+sum(comm) FROM emp;
    其中sum(sal+comm)统计的是工资与补助均不为空值的员工的总收入(如果sal、comm中有一个为空值NULL,则该行忽略不计),sum(sal) + sum(comm)统计的是工资不为空的员工的工资总和加上补助不为空的员工的补助总和。
    如果分组函数查询中,没有返回行或只有空值(分组函数的参数表达式均为空值),则分组函数返回空值。例如:
    DROP TABLE e1;
    CREATE TABLE e1(name VARCHAR2(20), sal NUMBER(8,2));
    --分组中包含0行记录,分组函数sum(sal)和avg(sal)均返回空值
    SELECT sum(sal), avg(sal) FROM e1;
    --INSERT INTO e1 VALUES('RUSKY',NULL);
    --INSERT INTO e1 VALUES('RUSKY2',NULL);
    --分组中包含记录,但因其sal字段均为空值、被sum(sal)及avg(sal)函数忽略,返回空值

    SELECT sum(sal), avg(sal) FROM e1; --返回空值
    --INSERT INTO e1 VALUES('RUSKY3',1000);
    SELECT * FROM e1
    NAME	SAL
    RUSKY	
    RUSKY2	
    RUSKY3	1000.00
    SELECT SUM(SAL),AVG(SAL),COUNT(SAL) FROM e1;
    SUM(SAL)	AVG(SAL)	COUNT(SAL)
    1000	1000	1
    SELECT SUM(SAL),AVG(SAL),COUNT(SAL) FROM e1;
    SUM(SAL)	AVG(SAL)	COUNT(SAL)
    1000	 1000	 1

    在实际应用中,如果需要将空值(空值字段对应的记录行)纳入到统计计算中,则可使用nvl函数将空值字段(或表达式)转换为指定的值(通常为0),然后再进行计算,例如:
    SELECT SUM(NVL(SAL,0)),AVG(NVL(SAL,0)) FROM e1;
    SUM(NVL(SAL,0)) AVG(NVL(SAL,0))
    1000 333.333333333333

    分组函数中的重复值
    除COUNT(*)外的所有分组函数均自动忽略空值。需要的话,还可以在除COUNT(*)外的分组函数中使用DISTINCT关键字过滤重复值,其语法格式为:
    <分组函数名>(DISTINCT(<参数表达式>))
    实际上,这些分组函数中还可以使用另一个与DISTINCT相对应的关键字ALL,即不对重复值进行过滤(缺省选项,因此一般没有人显式设置它),例如: 

    --DROUP TABLE e1
    --CREATE TABLE E1(NAME VARCHAR2(20),SAL NUMBER(8,2));
    /*INSERT INTO E1 VALUES('RUSKY1',2000);
    INSERT INTO E1 VALUES('RUSKY2',2000);
    INSERT INTO E1 VALUES('RUSKY3',1000);*/
    SELECT * FROM E1
    NAME	SAL
    RUSKY1	2000.00
    RUSKY2	2000.00
    RUSKY3	1000.00
    SELECT COUNT(SAL),SUM(SAL),AVG(SAL) FROM E1;
    COUNT(SAL)	SUM(SAL)	AVG(SAL)
    3	 5000	1666.66666666667
    SELECT COUNT(ALL(SAL)),SUM(ALL(SAL)),AVG(ALL(SAL)) FROM E1;
    COUNT(ALL(SAL))	SUM(ALL(SAL))	AVG(ALL(SAL))
    3	 5000	 1666.66666666667
    SELECT COUNT(DISTINCT(SAL)),SUM(DISTINCT(SAL)),AVG(DISTINCT(SAL)) FROM E1;
    COUNT(DISTINCT(SAL))	SUM(DISTINCT(SAL))	AVG(DISTINCT(SAL))
    2	 3000	 1500
    

      

  • 相关阅读:
    javaScript基本语法函数
    JavaScript内置对象 以及和 内置对象相关的语法
    SCRIPT5007: 属性“test”的值为 null、未定义或不是 Function 对象
    Dom4j的使用(全而好的文章)
    JavaScript的对话框
    Ajax重构
    java中4种操作(DOM,SAX,JDOM,DOM4J)xml方式详解与比较
    Dom4j的基本使用
    JavaScript事件处理(重要)
    母函数(Generating function)详解
  • 原文地址:https://www.cnblogs.com/rusking/p/3788988.html
Copyright © 2011-2022 走看看