`
yde986
  • 浏览: 97786 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Oracle 统计分组语句

阅读更多

      在应用系统开发中,进行需要统计数据库中的数据,当执行数据统计时,需要将表中的数据进行分组显示,在统计分组中是通过group by子句、分组函数、having子句共同实现的。其中group by子句用于指定要分组的列,而分组函数用户指定显示统计的结果,而having子句用户限制显示分组结果。
一、分组函数
      分组函数用于统计表的数据,并作用于多行,但是返回一个结果,一般情况下,分组函数要与group by子句结合使用,Oracle数据库提供了大量的分组函数,常用的五个分组函数:

Oracle代码

Max:该函数用于取得列或表达式的最大值,适用于任何数据类型。   
Min:该函数用于取得列或表达式的最小值,适用于任何数据类型。   
Avg:该函数用于取得列或表达式的平均值,适用于数字类型。   
Sum:该函数用于取得列或表达式的总和,  适用于数字类型。   
Count:该函数用于取的行数总和。   
Max:该函数用于取得列或表达式的最大值,适用于任何数据类型。
Min:该函数用于取得列或表达式的最小值,适用于任何数据类型。
Avg:该函数用于取得列或表达式的平均值,适用于数字类型。
Sum:该函数用于取得列或表达式的总和,  适用于数字类型。
Count:该函数用于取的行数总和。

注意:
       1、当使用分组函数时,分组函数只能出现在选择列表、order by和having子句中,而不能出现在where、group by子句中。
       2、当使用分组函数时,除了函数count(*)外,其他分组函数都会忽略NULL行。
       3、当执行select语句时,如果选择列表同时包括列、表达式和分组函数,那么这些列、表达式必须出现在group by子句中。

       4、当使用分组函数时,在分组函数中可以指定all和distinct选项,其中all是默认选项,该选项表示统计所有行数据(包括重复行),distinc可以统计不同行数据。

示例如下:
       1、取得某列最小值、最大值、平均值、总和和总计行数

Oracle代码
       select max(id) as max_id,min(id) as min_id,avg(id) as avg_id,sum(id) as sum_id,count(*) as count

from cip_temps; 

2、去除重复值

Oracle代码 

select count(distinct id) from cip_temps; 

 

二、group by和having子句
      group by子句是对统计的结果进行分组统计,而having子句用于限制分组显示结果,语法如下:
      select column,group_function from table [where condition][group by group_by_experssion] [having group_function];如上所示,column用于指定列表中的列或表达式,group_function用于指定分组函数,condition用于指定条件子句,group_by_experssion用于指定分组表达式,group_function用于指定排除分组结果条件。 

1、使用group by进行单列分组,如下:

Oracle代码
      select id as id,min(age) max_age,max(age) max_age from cip_temps group by id;   

2、使用having子句限制分组显示结果,如下:

Oracle代码
       select id as id,count(age) count from cip_temps group by id having count(age)=2;

 

三、case表达式
case格式如下:

Oracle代码
case when 条件 then 返回值1 when 条件2 then 返回值2 else 返回值3 end  
case when 条件 then 返回值1 when 条件2 then 返回值2 else 返回值3 end
示例如下:
select name,age,address,case when id=21 then 'abc' when id=22 then 'def' else 'hij' end alias from cip_temps;


四、Oracle常用统计函数
1、数字函数
       (1)、mod(m,n)该函数用于返回取得两个数字相除后的余数,如果数字为0,则返回结果为m。
       (2)、round(n,[m]该函数用于取得四舍五入运算,如果省略m,则四舍五入至整数位;如果m是负数,则四舍五入到小数点前m位;如果m是正数,则四舍五入到小数点后m位。
       (3)、trunc(n,[m])该函数用于截取数字,如果省略m,则将数字n的小数部门截取;如果m为正数,则将数字n截取至小数点后的第m位,如果m为负数,则将数字n截取小数点的前m为。
示例如下:

Oracle代码

select mod(10,4) from dual;   
select round(101234.567,-4) from dual;   
select round(101.234567,4) from dual;   
select trunc(101234.457,2) from dual;   
select trunc(101234.457,-2) from dual;  
select mod(10,4) from dual;
select round(101234.567,-4) from dual;
select round(101.234567,4) from dual;
select trunc(101234.457,2) from dual;
select trunc(101234.457,-2) from dual;

2、日期函数
       (1)、round(d,[fmt])该函数用于返回日期时间的四舍五入结果,如果fmt指定年度,则7月1日为分割线;如果fmt指定月,则16日为分割线;如果fmt指定为天,则中午12:00为分割线。
       (2)、trunc(d,[fmt])该函数用于截取日期时间数据,如果fmt指定年度,则结果为本年度的1月1日,如果fmt指定月,则结果为本月1日。
示例如下:

Oracle代码

select round(sysdate,'yyyy') from dual;   
select round(sysdate,'mm') from dual;   
select round(sysdate,'dd') from dual;   
select trunc(sysdate,'yyyy') from dual;   
select trunc(sysdate,'mm') from dual;   
select trunc(sysdate,'dd') from dual;  
select round(sysdate,'yyyy') from dual;
select round(sysdate,'mm') from dual;
select round(sysdate,'dd') from dual;
select trunc(sysdate,'yyyy') from dual;
select trunc(sysdate,'mm') from dual;
select trunc(sysdate,'dd') from dual;

3、转换函数
    (1)、to_char(date,fmt)该函数用于将日期类型转换为字符串类型,其中fmt用于指定日期格式。
    (2)、to_date(char,fmt)该函数用于将符合特定日期格式的字符串转变为date类型的值。
    (3)、to_number(char)该函数用于将符合特定数字格式的字符串转换为数字类型。
示例如下:

Oracle代码

select to_date('2009-3-1','yyyy-mm-dd') from dual;   
select to_char(sysdate,'YYYY-MM-DD HH24:MI:SS') from dual;   
select to_number('10.123') from dual;  
select to_date('2009-3-1','yyyy-mm-dd') from dual;
select to_char(sysdate,'YYYY-MM-DD HH24:MI:SS') from dual;
select to_number('10.123') from dual;

4、其他单行函数
      (1)、decode(expr,search1,result1[,search2,result2,...],default)该函数用于返回匹配于特定表达式结果,如果search1匹配与expr,则返回结果result1,如果search2匹配expr,则返回结果result2,以此类推,如果没有任何匹配关系,则返回默认default。
示例如下:

Oracle代码
        select name,decode(age,'bb21',id*10,'bb22',id*20,1000) as decodee from cip_temps;

注意:decode函数和case表达式的用法基本相似,但是case表达式可以多个条件进行判断,从而返回结果。
示例如下:

Oracle代码
         select name,case when (   
                      (age='bb21' and address='cc21')    
                       or (age='bb22' and address='cc22')    
                       or (age='bb23' and address='cc23')    
                      ) then 1 else 0 end as cases from cip_temps  

分享到:
评论

相关推荐

    Oracle数据库按时间进行分组统计数据的方法

    Oracle按不同时间分组统计的sql 如下表table1: 日期(exportDate) 数量(amount) -------------- ----------- 14-2月 -08 20 10-3月 -08 2 14-4月 -08 6 14-6月 -08 75 24-10月-09 23 14-11月-09 45 04-8月 -10 5 ...

    Oracle数据库SQL语句优化策略

    基本的Sql编写注意事项 尽量少用IN操作符,基本上所有的IN操作符都可以用EXISTS代替 用IN写出来的SQL的优点是比较容易写及清晰易懂,但是用IN...一般的SQL都可以转换成功,但对于含有分组统计等方面的SQL就不能转换了。

    高性能动态SQL Oracle数据安全 Oracle 数据库的聚簇技术 等等

    提高Oracle数据库查询统计速度 14 Oracle中巧取指定记录 14 Oracle数据安全 15 Oracle字段上建立并使用索引 29 用Windows脚本宿主自动化Oracle工具 31 进程结构和内存结构 32 Oracle监控数据库性能的SQL汇总 36 ...

    ORACLE多条件统计查询的简单方法

    由于我要做的分组查询统计,是要罗列每一种情况,而且根据输入的“管理员编号”不同返回不同结果,结果记录的条数和每一种情况是可知的,这个语法完全可用 核心代码如下: SELECT SUBSTR(A.业务,1,2) 行政区域,...

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    6.2.3 收集执行计划统计信息 151 6.2.4 标识SQL语句以便以后取回计划 153 6.2.5 深入理解DBMS_XPLAN的细节 156 6.2.6 使用计划信息来解决问题 161 6.3 小结 169 第7章 高级分组 170 7.1 基本的GROUP BY用法 ...

    Oracle数据库SQL语句优化总结

    一、操作符优化  1、IN 操作符  用IN写出来的SQL的优点是...一般的SQL都可以转换成功,但对于含有分组统计等方面的SQL不能转换了。  推荐方案:在业务密集的SQL当中尽量不采用IN操作符,用EXISTS 方案代替。  

    SQL语句集锦.rar

    多表对多表进行统计.txt 大小写转换.txt 子查寻和内联查寻.txt 学生名次.txt 嵌套游标的使用.txt 拷贝表格.txt 排序.txt 断开并更改数据库名称.txt 新建 文本文档 (6).txt 新建 文本文档.txt 有关NULL.txt ...

    oracle11g

    第五章:分组函数 第六章:数据限定和排序 第七章:复杂查询(上):多表连接技术 第八章:复杂查询(下):子查询 第二部分:用户及数据库对象 第九章:用户访问控制 第十章:Oracle的事务和锁 第十一章:...

    oracle实验报告

    PL/SQL块中的可执行部分是由一系列语句组成的(包括对数据库进行操作的SQL语句,PL/SQL语言的各种流程控制语句等)。在块中对数据库查询,增、删、改等对数据的操作是由SQL命令完成的。在PL/SQL块中,可以使用SQL的...

    最全的oracle常用命令大全.txt

    数据字典里存有用户信息、用户的权限信息、所有数据对象信息、表的约束条件、统计分析数据库的视图等。 我们不能手工修改数据字典里的信息。  很多时候,一般的ORACLE用户不知道如何有效地利用它。  dictionary...

    Oracle数据库、SQL

    8.1报表统计常用 16 8.2缺省情况组函数处理什么值 16 8.3当组函数要处理的所有值都为null时 16 8.4行级信息和组级信息 16 九、 group by子句 17 9.1语法和执行顺序 17 9.2分组过程 17 9.3常见错误 17 9.4多列分组 17...

    OCPOCA认证考试指南全册:Oracle Database 11g(1Z0-051,1Z0-052,1Z0-053)--详细书签版(第2/2部分)

     Bob Bryla是Oracle 9i和10g的认证专家,他在数据库设计、数据库应用程序开发、培训和Oracle数据库管理等方面拥有20多年的工作经验,他也足Dodgeville的Land'End公司的首席Internet数据库设计师和Oracle DBA. ...

    ORACLE SQL语句优化技术要点解析

    操作符优化: IN 操作符  用IN写出来的SQL的优点是比较容易写...一般的SQL都可以转换成功,但对于含有分组统计等方面的SQL就不能转换了。  推荐方案:在业务密集的SQL当中尽量不采用IN操作符。 NOT IN操作符  

    oracle教案(doc)+SQL Reference 10g(chm).rar

    3.2.8 组函数及分组统计 (重点) 52 3.2.9 子查询 58 3.2.10 ROWNUM伪列(重点) 63 3.2.11 集合操作 65 3.2.12 连接查询及分组查询强化训练 68 3.3 数据库的更新操作 69 3.3.1 添加数据 69 3.3.2 添加数据的语法 69 ...

    oracle数据库经典题目

    11. 查询一个表的总记录数,可以采用_________统计函数。( C ) A. AVG(*) B. SUM(*) C. COUNT(*) D.MAX(*) 12. 要建立一个语句向Types表中插入数据,这个表只有两列,T_ID和T_Name列。如果要插入一行数据,这一...

    Oracle数据库实验操作

    实验17:分组统计函数 33 实验18:表的连接查询 36 实验19:sql99规则的表连接操作 40 实验20:子查询 41 DDL和DML语句 45 实验21:建立简单的表,并对表进行简单ddl操作 45 实验22:dml语句,插入删除和修改表的...

    oracle sql &plsql

    内容分为2大部分,1-13章为oracle sql,介绍了sql*plus的使用,基本查询语句,单行函数,多表查询,组函数和分组统计。。。。。。

    oracle实现动态查询前一天早八点到当天早八点的数据功能示例

    本文实例讲述了oracle实现动态查询前一天早八点到当天早八点的数据。分享给大家供大家参考,具体如下: 需要查询前一天早八点到当天早八点的数据 这里是查询sql语句 SELECT DEPT_ID, COUNT( * ) DID FROM MES_...

Global site tag (gtag.js) - Google Analytics