`

Oracle group by 用法实例详解

 
阅读更多

Group by的语法

Select [filed1,fild2,]聚合函数(filed),

[Grouping(filed),]

[Grouping_id(filed1,filed2,…)]

From tablename

Where condition

[Group by {rollup|cube}(filed,filed2)]

[having condition]

[order by filed1]

一、基本用法:

(1)我们通过几个例子来研究groupby的基本用法

创建测试表

SQL> create table sales(

2 empid number, --雇员ID

3 depid number, - -部门ID

4 area varchar(20), --区域

5 salenum number); --销售额

表已创建。

SQL> insert into sales values(1,1,'china',10);

SQL> insert into sales values(2,1,'china',10);

SQL> insert into sales values(3,1,'china',10);

SQL> insert into sales values(3,1,'china',10);

SQL> insert into sales values(3,1,'china',10);

SQL> insert into sales values(1,1,'china',10);

SQL> insert into sales values(2,1,'china',10);

SQL> insert into sales values(4,2,'china',10);

SQL> insert into sales values(4,2,'china',10);

SQL> insert into sales values(5,3,'us',10);

SQL> insert into sales values(5,3,'us',10);

需求1,按部门统计销售额 (简单用法)

SQL> select depid,sum(salenum) from sales group by depid;

DEPID SUM(SALENUM)

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

1 70

2 20

3 20

需求2,按部门统计销售额,并且只显示销售总额小于30的部门及销售额(使用having子句)

SQL> select depid,sum(salenum) totalnum from sales

group by depid

having sum(salenum) <30;

DEPID SUM(SALENUM)

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

2 20

3 20

注解:需求2需要使用having字名,而且在子句中不能使用别名,必须使用在select语句中书写的形式

(2)Where 和having的区别

Wheret和having子句都用来筛选数据,但是where是针对原数据进行筛选,而having子句只是针对汇总后的结果进行筛选,所以在需求二的例子中,想要对销售总额进行过滤只能使用having子句

(3)使用order by 排序

SQL> select depid,sum(salenum) from sales group by depid;

DEPID SUM(SALENUM)

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

1 70

2 20

3 20

注意观察需求1的例子,depid是已经按照在depid升序排列的,这是因为oracle在做聚合统计的时候会首先对字段进行排序,所以最终的结 果是按照升序进行排列的,如果order by后跟着多个字段,默认排序是先对第一个字段升序排序,然后再排第二个字段,以此类推,所以如果在应用中仅仅需要长序排序可以不用加order by 参数,毕竟这会影响性能

二、扩展用法:

扩展用法使用下面的表进行实验研究

SQL> create table testgroup(

2 a varchar(5),

3 b varchar(5),

4 c varchar(5),

5 n number);

建完测试表,然后插入两条测试数据

SQL> insert into testgroup values('a1','b1','c1',10);

SQL> insert into testgroup values('a1','b1','c1',20);

我们使用基本的group by 可以得到以下结果

SQL> select a,b,c,sum(n) total from testgroup group by a,b,c;

A B C TOTAL

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

a1 b1 c1 30

(1)使用rollup操作符

Rollup意思有”卷起,汇总”的意思,他可以在使得在其括号中的字段,按从右到左的顺序分别group后显示,类似我们用多个group by 语句,然后union all起来,我们把针对上面的测试表,使用rollup操作符,看看效果

SQL> select a,b,c,sum(n) total from testgroup group by rollup(a,b,c);

Result:

A B C TOTAL
a1 b1 c1 30
a1 b1 30
a1 30
30

从上面结果可以看出, 除了对(a1,b1,c1)进行了汇总外,又从右向左分别对子句中的”a,b,c”字段进行了汇总,例如(a1,b1),(a1) ()

(2)使用cube操作符

Cube意思是立方,使用该操作符可以对操作符内的字段,进行遍历组合汇总,例如cube(a,b,c),那么就会产生8种组合结果,分别如下”a-b-c”,”a-b”,”a”,”a-c”,” b-c”,”b”,”c”,”空”,看下面的例子

SQL> select a,b,c,sum(n) total from testgroup group by cube(a,b,c);

Result:

A B C TOTAL
30
c1 30
b1 30
b1 c1 30
a1 30
a1 c1 30
a1 b1 30
a1 b1 c1 30

(3),使用grouping(filed)函数

使用grouping 函数必须先理解rollup 和cube操作符,那么grouping函数有什么用呢?在日常应用中,我们通过rollup或者cube对汇总进行了汇总,汇总后的结果往往要传送到应 用程序端,在应用程序端我们必须要有一个依据来判断某行数据是不是按照rollup或cube进行汇总,grouping函数可以用来产生这个依据,他可 以接收一个参数,判断该参数是否为null,是则返回1,否则返回0,我样可以据此来判断该是否按某列进行汇总统计的,当然在实验应用中,0和1看起来不 那么直观,我们可以使用decode或者case函数进行转议,让查看结果看起来更直观,请看以下例子

SQL> select grouping(a) ca,grouping(b) cb,grouping(c) cc, a,b,c,sum(n) from testgroup group by rollup(a,b,c);

Result:

CA CB CC A B C SUM(N)
0 0 0 a1 b1 c1 30
0 0 1 a1 b1 30
0 1 1 a1 30
1 1 1 30

(4)使用grouping_id(filed1,file2,…)函数

使用grouping函数有时候感觉不是那么灵活的,他只能接收一个字段,而grouping_id()函数则可以接收多个字 段,GROUPING_ID()函数可以接受一列或多列,返回按GROUPING位向量进行计算的十进制值。下面我们通过一个例子来研究 grouping_id函数是如何按照grouping函数的位向量进行计算的。

SQL> select grouping(a) ca,grouping(b) cb,grouping_id(a,b) caandb, a,b,sum(n) from testgroup group by rollup(a,b);

Result:

CA CB CAANDB A B SUM(N)
0 0 0 a1 b1 30
0 1 1 a1 30
1 1 3 30

位向量计算方法:如上例,

第一行,CA=0,CB=0,那么位向量就是“00”,换算成十进制是0

第二行,CA=0,CB=1,那么位向量就是‘01’,换算成十进制是1

第三行,CA=1,CB=1,那么位向量就是‘11’,换算成十进制是3

请注意上例中grouping_id的计算值跟括号内的字段顺序有关,上例中书写顺序是grouping_id(a,b),a字段在前面,如果换下顺序grouping_id(b,a),计算结果是不一样的,看下例

SQL> select grouping(a) ca,grouping(b) cb,grouping_id(b,a) caandb, a,b,sum(n) from testgroup group by rollup(a,b);

Result:

CA CB CAANDB A B SUM(N)
0 0 0 a1 b1 30
0 1 2 a1 30
1 1 3 30

看看第二行红色字体,grouping_id中的字段顺序发生了变化,位向量值也不一样了

(4-1) grouping_id()函数的用途

上面讲了grouping_id的用法,但在日常工作中,我们如何应用该函数呢?其实只要了解了他的原理及用法,要怎么用,就看我们是否可以灵活使用了,下面介绍一种常见的用法:

假如我们要对某testgroup进行分组统计,并且过滤掉不包括小计或总计的行,这时grouping_id就有用武之地了,我们可以利用grouping_id的值结合having子句,通过判断grouping_id是否大于0来过滤掉不需要的行。

SQL> select grouping(a) ca,grouping(b) cb,grouping_id(a,b) caandb, a,b,sum(n) from testgroup group by rollup(a,b) having grouping_id(a,b)>0;

Result:

CA CB CAANDB A B SUM(N)
0 1 1 a1 30
1 1 3 30

原文路径:http://laoyao999.blog.51cto.com/3080098/573256

分享到:
评论

相关推荐

    linux下oracle手动建实例

    ### Linux 下 Oracle 手动建实例详解 #### 一、概述 在Linux环境中手动构建Oracle实例是一项高级且复杂的任务,通常适用于需要定制化配置或特殊需求的场景。本文档将根据给定的信息,详细介绍如何在Linux环境下手动...

    oracle实例详解

    ### Oracle实例详解 #### 引言 随着信息技术的飞速发展,数据库技术成为了现代企业和组织不可或缺的一部分。Oracle作为全球领先的企业级数据库管理系统之一,在众多领域内广泛应用。本篇旨在通过对Oracle文档的...

    oracle 的表空间实例详解

    表空间实例详解将深入解析Oracle表空间的概念、作用、类型以及如何管理和操作表空间。 1. **表空间的概念** 表空间是Oracle数据库中的一种逻辑存储单元,它由一个或多个数据文件(.dbf)组成。每个数据库都有至少...

    oracle存储过程语法及实例讲解

    ### Oracle存储过程语法及实例详解 #### 一、概述 Oracle存储过程是一种在数据库服务器上预编译并存储的程序块,它可以包含一系列SQL语句和控制流语句。存储过程提高了应用程序性能,并增强了数据的一致性和安全性...

    ORACLE 动态性能视图详解

    在OPS(Oracle Parallel Server)环境中,`GV$`视图可以用来查询OPS_ADMIN_GROUP参数定义的实例组信息,但需要满足`PARALLEL_MAX_SERVERS`参数大于零,并且OPS_ADMIN_GROUP参数至少有一个成员。 访问动态性能视图...

    ORACLE 11GRAC配置单实例ADG

    ### ORACLE 11GRAC配置单实例ADG #### 环境配置与搭建步骤详解 本篇文章将详细介绍如何在Oracle 11g RAC环境下配置单实例ADG(Active Data Guard)。此配置适用于希望在高可用性环境中实现数据复制的企业级应用...

    Oracle语法详解2.rar

    本资料包“Oracle语法详解2.rar”包含了对Oracle数据库语法的深入解析,旨在帮助学习者更好地理解和应用Oracle SQL。 首先,我们来看“限定查询和排序-cl.avi”这个视频文件。在Oracle SQL中,查询数据并进行排序是...

    OracleASM详解[参考].pdf

    Oracle ASM 详解 Oracle ASM(Automatic Storage Management)是 Oracle 主推的一种面向 Oracle 的存储解决方案。ASM 和 RDBMS 非常相似,ASM 也是由实例和文件组成,也可以通过 sqlplus 工具来维护。 一、ASM ...

    Oracle,PLSQL课件详解,适合初学者,配备实例,全英文,在学习数据库之余亦可以提高英语水平

    你将学习如何编写SQL语句,包括SELECT、INSERT、UPDATE、DELETE以及更复杂的JOIN、GROUP BY和HAVING子句。 3. **PL/SQL介绍**:PL/SQL是Oracle特有的编程语言,它允许你编写存储过程、函数、触发器等数据库对象。你...

    Oracle排名函数(Rank)实例详解

    在本实例中,我们将详细探讨Oracle中的Rank()函数及其使用方法。 Rank()函数的基本用法是在`OVER()`子句中,通过指定`ORDER BY`来决定排名依据。其语法如下: ```sql rank() over (order by 排序字段 [asc|desc]) ...

    超详细ORACLE培训实例

    ### 超详细ORACLE培训实例知识点概览 #### 引言 - **SUN与Oracle合并背景**:2009年,Oracle宣布以74亿美元收购SUN,这一举措被视为Oracle进军云计算领域的关键步骤。SUN拥有强大的硬件基础和技术积累,特别是其在...

    ofbiz实现oracle平台小例子详解步骤及注意的问题.doc

    Oracle数据库是一个强大的关系型数据库管理系统,常用于支持大型企业级应用。 **配置步骤** 1. **创建项目目录**:通常,OFBiz项目是在`hot-deploy`目录下创建的。例如,你可以创建一个名为`hellosix`的新目录,...

    Oracle表中重复数据去重的方法实例详解

    总的来说,Oracle提供了多种方法来处理重复数据,包括`DISTINCT`、`UNION ALL`和`GROUP BY`等。但针对大量数据,使用分析函数结合`DELETE`语句通常更有效率。在实际应用中,应根据具体需求选择合适的方法,并注意...

    三种Windows版本下如何卸载Oracle

    - `HKEY_LOCAL_MACHINE\SOFTWARE` 下,删除 `ORACLE` 键和 `Apache Group` 键。 - `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services` 下,删除以 `Oracle` 开头的键。 - `HKEY_LOCAL_MACHINE\SYSTEM\...

    oracle常用命令详解

    以下是对"Oracle常用命令详解"文档中可能包含的一些关键知识点的详细介绍: 1. **SQL*Plus命令**: - `SELECT`:用于从表中查询数据,是最基础的SQL命令。 - `INSERT`:用于向表中插入新的记录。 - `UPDATE`:...

    11gr2单实例静默安装配置

    ### 11gr2单实例静默安装配置详解 #### 一、概述 在企业级应用环境中,Oracle数据库系统的部署通常需要高度自动化的过程来确保高效且一致性的安装体验。静默安装模式(Silent Installation)作为一种自动化安装...

    Oracle RAC 核心技术

    Oracle RAC(Real Application Clusters)是一种集群数据库解决方案,它允许多个数据库实例同时访问同一组数据文件,从而实现高性能、高可用性和可扩展性。通过将多个服务器节点组织成一个集群,RAC 能够显著提高...

    oracle单实例恢复至rac

    ### Oracle 单实例恢复至 RAC 过程详解 #### 概述 Oracle RAC(Real Application Clusters)是Oracle数据库的一种集群技术,它能够提供高可用性和高性能,支持多台服务器共享一个数据库实例。而从Oracle单实例恢复...

    NBU 7.6 Oracle图形化智能策略

    《NBU 7.6 Oracle图形化智能策略详解》 NetBackup(NBU)7.6版本中的Oracle图形化智能策略是一项重要的功能,它为Oracle数据库的备份与恢复提供了直观且高效的操作方式。该策略充分利用了NetBackup的自动化发现与...

Global site tag (gtag.js) - Google Analytics