一、组函数嵌套

ORACLE中规定,组函数嵌套只能嵌两层。其实多层嵌套并没有实际的用途,因此ORACLE没有提供组函数的多层嵌套。但是,单行函数是可以多层嵌套的。

二、

1、Oracle包含以下组函数
  -AVG([DISTINCT|ALL]n) 返回平均值,忽略空值
  -COUNT({*|[DISTINCT|ALL]}expr) 返回记录的数量,用*包含空值,否则不包含空值
  -MAX([DISTINCT|ALL]expr)  返回最大值,忽略空值
  -MIN([DISTINCT|ALL]expr) 返回最小值,忽略空值
  -SUM([DISTINCT|ALL]n)  返回总值,忽略空值
  -STDDEV([DISTINCT|ALL]x)  返回标准差,忽略空值
  -VARIANCE([DISTINCT|ALL]x)  返回统计方差,忽略空值

2、AVG和SUM的用法
  -可以对数值型数据使用AVG和SUM  
  例:
     SELECT AVG(sal),SUM(sal)
     FROM   EMP
     WHERE  job LIKE 'SALES%';

3、MIN和MAX的用法
  -MIN和MAX可以用于任何数据类型
  例:
     SELECT MIN(hiredate),MAX(hiredate)
     FROM   emp;
  结果:
       MIN(HIREDATE)   MAX(HIREDATE)  
        17-12月-80      23-5月 -87

4、

COUNT的用法
1)COUNT(*)返回表中行的总数
  例:
     SELECT  COUNT(*)
     FROM    emp
     WHERE   deptno=30;
  结果: 
        COUNT(*)  
              6  
2)COUNT(expr)返回非空行的数量
  例:
     SELECT  COUNT(comm)
     FROM    emp
     WHERE   deptno=30;
  结果:
       COUNT(*)  
              4

5.组函数和空值
1)组函数会忽略列中的空值
  例:
     SELECT  AVG(comm)
     FROM    emp;
  结果:
       AVG(COMM)
             550
2)NVL函数可以使组函数强制包含含有空值的记录
  例:
     SELECT AVG(NVL(comm,0))
     FROM   emp;
  结果:
       AVG(NVL(COMM,0))  
             157.142857

6、创建数据组
  SELECT     column,group_function(column)
  FROM       table
  [WHERE     condition]
  [GROUP BY  group_by_expression]
  [OEDER BY  column];
  
  -通过GROUP BY子句将表中的记录划分成若干个小组
  -GROUP BY子句中必须包含指定的列
  -GROUP BY子句中不能使用列的别名
  -当使用GROUP BY子句时Orale服务器会自动对结果集合默认按GROUP BY子句所指定的列升序排列
  -在SELECT列表中除了组函数外,所有列都必须包含在GROUP BY子句中
  例:
     SELECT   deptno,AVG(sal)
     FROM     emp
     GROUP BY deptno;
  结果:
        DEPTNO     AVG(SAL)  
          10       2916.66667  
          20       2175  
          30       1566.66667
   -GROUP BY所指定的列并不是必须出现在SELECT列表中
   例:
      SELECT   AVG(sal)
      FROM     emp
      GROUP BY deptno;
   结果:
             AVG(SAL)  
           2916.66667  
                 2175  
           1566.66667

7.按多个列分组
  例:
     SELECT   deptno,job,sum(sal)
     FROM     emp
     GROUP BY deptno,job;
  结果:
        DEPTNO     JOB       SUM(SAL)  
            10     CLERK         1300  
            10     MANAGER       2450  
            10     PRESIDENT     5000  
            20     CLERK         1900  
            20     ANALYST       6000  
            20     MANAGER       2975  
            30     CLERK          950  
            30     MANAGER       2850  
            30     SALESMAN      5600

8.使用组函数的非法查询
  例:
     SELECT dept,COUNT(ename)
     FROM   emp;
  结果:
        ERROR 位于第 1 行: 
        ORA-00937: 非单组分组函数 
  纠正:
       SELECT   dept,COUNT(ename)
       FROM     emp
       GROUP BY deptno;
  结果:
        DEPTNO    COUNT(ENAME)  
            10               3  
            20               5  
            30               6

9.限制组结果
  使用HAVING子句限制组
  -对记录分组
  -在分组的基础上应用组函数
  -与HAVING子句匹配的结果才输出

SELECT    column,group_function
  FROM      table
  [WHERE    condition]
  [GROUP BY group_by_expression]
  [HAVING   group_condition]
  [ORDER BY column];
  
  例1:
     SELECT   deptno,max(sal)
     FROM     emp
     WHERE    max(sal)>2900
     GROUP BY deptno;
  结果:
        ERROR 位于第 3 行: 
        ORA-00934: 此处不允许使用分组函数 
  纠正:
        SELECT   deptno,max(sal)
        FROM     emp
        GROUP BY deptno
        HAVING   max(sal)>2900;
  结果:
        DEPTNO     MAX(SAL)  
            10         5000  
            20         3000
  例2:
        SELECT   job,SUM(sal) PAYROLL
        FROM     emp
        WHERE    job NOT LIKE 'SALES%'
        GROUP BY job
        HAVING   SUM(sal)>5000
        ORDER BY SUM(sal);
  结果:
        JOB           PAYROLL  
        ANALYST          6000  
        MANAGER          8275

10.组函数嵌套 
   -与单行函数不同,组函数只能嵌套两层
   例:显示平均薪水的最大值
       SELECT   max(avg(sal))
       FROM     emp
       GROUP BY deptno;
   结果:
         MAX(AVG(SAL))  
            2916.66667

练习
1.使用emp表显示所有雇员的最多、最少、总和、平均薪水
   
   SELECT ename,MAX(sal),MIN(sal),SUM(sal),AVG(sal)
   FROM   emp;
  
2.显示emp表中不同部门编号的数量
  
   SELECT COUNT(DISTINCT deptno)
   FROM   emp;

3.在emp表中根据job列分组显示雇员的最多、最少、总和、平均薪水
   
   SELECT   job,MAX(sal),MIN(sal),SUM(sal),AVG(sal)
   FROM     emp 
   GROUP BY job;

4.使用emp表显示job名、每组最多、最少、总和、平均薪水
  要求:按job列分组,ename列的名字不是以A开头,且任何组的最少薪水大于1600

SELECT   job,MAX(sal),MIN(sal),SUM(sal),AVG(sal)
   FROM     emp
   WHERE    ename NOT LIKE 'A%'
   GROUP BY job
   HAVING   MIN(sal)>1600

5.显示部门名和每个部门的累计薪水,要求每个部门的累计薪水大于3000

SELECT   dname,SUM(sal)
   FROM     emp e,dept d
   WHERE    e.deptno=d.deptno
   GROUP BY dname
   HAVING   SUM(sal)>3000;

6.显示每个部门、每个岗位的最高及最低薪水

SELECT   deptno,job,MAX(sal),MIN(sal)
   FROM     emp
   GROUP BY deptno,job;

三、sql聚合函数嵌套问题

问题:我现在要查的是top client(买东西总和加起来最多的)

所以我输了 SELECT C.CLIENTNO, C.CNAME, MAX(SUM(P.AMOUNT))
           FROM CLIENT C,PURCHASE P
           WHERE C.CLIENTNO=P.CLIENTNO
           GROUP BY C.CLIENTNO,C.CNAME;
提示说不是单组分组函数,所以 问题应该是出在 max(sum(p.amount))上吧,应该如何分开来写啊

解答:

with as
 (SELECT job, deptno, sum(sal) sal FROM emp group by job, deptno)
select from where sal = (select max(sal) from t)

oracle 组函数的更多相关文章

  1. Oracle组函数、多表查询、集合运算、数据库对象(序列、视图、约束、索引、同义词)等

    count组函数:(过滤掉空的字段) select count(address),count(*) from b_user max() avg() min(),sum() select sum(age ...

  2. 数据库Oracle组函数和分组函数

    组函数: 组函数操作行集,给出每组的结果.组函数不象单行函数,组函数对行的集合进行操作,对每组给出一个结果.这些集合可能是整个表或者是表分成的组. 组函数与单行函数区别: 单行函数对查询到每个结果集做 ...

  3. Oracle 组函数count()

    1.count() 函数的参数除了可以是字段值和表达式外,还可以是“ * ”.如果是字段值或表达式,则忽略空值且考虑重复值:如果是“ * ”,则计算所有的行,也包括空值.如果要查询某字段非重复值的个数 ...

  4. oracle(sql)基础篇系列(一)——基础select语句、常用sql函数、组函数、分组函数

        花点时间整理下sql基础,温故而知新.文章的demo来自oracle自带的dept,emp,salgrade三张表.解锁scott用户,使用scott用户登录就可以看到自带的表. #使用ora ...

  5. Netsuite Formula > Oracle函数列表速查(PL/SQL单行函数和组函数详解).txt

    PL/SQL单行函数和组函数详解 函数是一种有零个或多个参数并且有一个返回值的程序.在SQL中Oracle内建了一系列函数,这些函数都可被称为SQL或PL/SQL语句,函数主要分为两大类: 单行函数 ...

  6. oracle数据库之组函数

    组函数也叫聚合函数,用来对一组值进行运算,并且可以返回单个值 常见的组函数: (1)count(*),count(列名)  统计行数:找到所有不为 null 的数据来统计行数 (2)avg(列名)  ...

  7. Oracle常用sql语句(二)之组函数、多表查询

    DML(数据操纵语言) INSERT .UPDATE. DELETE 插入操作:INSERT: 语法: INSERT INTO 表名(列名1,列名2 ...)VALUES(列值1,列值2...); 注 ...

  8. oracle(sql)基础篇系列(一)——基础select语句、常用sql函数、组函数、分组函数

    花点时间整理下sql基础,温故而知新.文章的demo来自oracle自带的dept,emp,salgrade三张表.解锁scott用户,使用scott用户登录就可以看到自带的表. #使用oracle用 ...

  9. ORACLE SQL 组函数【weber出品必属精品】

    组函数:对一组数据进行加工,每组数据返回一个值 常用的组函数:count()  avg()  max()   min()  sum()   count()函数  1. count(*) :返回总共的行 ...

随机推荐

  1. Linux内核通杀提权漏洞CVE-2016-5195 - 内核升级方法

    如题,对于脏牛(Dirty COW)漏洞的修复方式已经在上篇文章中有介绍过如何验证,这里对如何升级内核给出修复建议. (注意:为避免不必要的生产风险的发生,请审核自己的实际环境而决定采用什么方法进行升 ...

  2. AdventureWorksDW2008R2 attach: Unable to open the physical file. Operating system error 5: "5(Access is denied.)

    http://stackoverflow.com/questions/26014133/adventureworksdw2008r2-attach-unable-to-open-the-physica ...

  3. linux 配置 wlan 连接

    第一步,先确定你已经安装了无线网卡驱动.我的是 ath9k ,linux 内核不自带,现编译成模块 然后安装上.具体步骤请自行搜索 linux 编译内核 第二步,起用模块 modprobe ath9k ...

  4. NDK(1)配置ndk,含eclipse,Android Studio1.5.1

    现在的ndk配置已经非常简单,如果看到要cygwin的请关闭. 1,Eclipse 添加ndk linux,mac ,windows 相似, a.下载 ndk并解压, b.在eclipse的andro ...

  5. Setup Entity Framework Environment

    http://www.entityframeworktutorial.net/EntityFramework5/setup-entityframework-environment.aspx Entit ...

  6. [HDOJ2830]Matrix Swapping II(胡搞)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2830 给一个矩阵只有0和1,矩阵的列可以和其他列交换无数次,问交换后整个矩阵形成的最大的全是1的子矩阵 ...

  7. leetcode:String to Integer (atoi)

    Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input cases. ...

  8. ural1221. Malevich Strikes Back!

    http://acm.timus.ru/problem.aspx?space=1&num=1221 算是枚举的 题目意思是必须划出这样的 11011 10001 00000 10001 110 ...

  9. 【转+分析】JAVA: 为什么要使用"抽象类"? 使用"抽象类"有什么好处?

    老是在想为什么要引用抽象类,一般类不就够用了吗.一般类里定义的方法,子类也可以覆盖,没必要定义成抽象的啊. 看了下面的文章,明白了一点. 其实不是说抽象类有什么用,一般类确实也能满足应用,但是现实中确 ...

  10. JAVA设计模式之【工厂方法模式】

    看例子 1.TV产品接口,负责播放 public interface TV // TV接口 { public void play(); } 2.TV工厂接口,负责生产产品 public interfa ...