Bootstrap

group oracle用法,Oracle group by 用法实例详解

Group by的语法oracle

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

[Grouping(filed),]函数

[Grouping_id(filed1,filed2,…)]性能

From tablename测试

Where condition字体

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

[having condition]code

[order by filed1]排序

1、基本用法:

(1)咱们经过几个例子来研究groupby的基本用法ci

建立测试表

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 参数,毕竟这会影响性能

2、扩展用法:

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

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

;