oracle group by用法多个字段_学会Oracle分组函数rollup,让你在数据统计和报表方面得心应手!...

本文介绍了Oracle ROLLUP分组函数的使用,通过实例展示了如何进行多字段分组和统计,揭示了GROUPING函数的作用,并对比了与普通GROUP BY的效率优势。适合对数据库统计查询感兴趣的读者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

今天主要分享Oracle ROLLUP分组函数的用法,体验一下Oracle在统计查询领域中的函数魅力。ROLLUP分组函数可以理解为Group By分组函数封装后的精简用法。


01

初始化实验坏境

1)创建测试表group_test

create table group_test (group_id int, job varchar2(10), name varchar2(10), salary int);
bb68b2987a806f9e89ddd1aa8b423ee9.png

2)初始化数据

insert into group_test values (10,'Coding', 'Bruce',1000);insert into group_test values (10,'Programmer','Clair',1000);insert into group_test values (10,'Architect', 'Gideon',1000);insert into group_test values (10,'Director', 'Hill',1000);insert into group_test values (20,'Coding', 'Jason',2000);insert into group_test values (20,'Programmer','Joey',2000);insert into group_test values (20,'Architect', 'Martin',2000);insert into group_test values (20,'Director', 'Michael',2000);insert into group_test values (30,'Coding', 'Rebecca',3000);insert into group_test values (30,'Programmer','Rex',3000);insert into group_test values (30,'Architect', 'Richard',3000);insert into group_test values (30,'Director', 'Sabrina',3000);insert into group_test values (40,'Coding', 'Samuel',4000);insert into group_test values (40,'Programmer','Susy',4000);insert into group_test values (40,'Architect', 'Tina',4000);insert into group_test values (40,'Director', 'Wendy',4000);commit;
815b014fe62026851896c3e23703a3f3.png

3)初始化之后的数据:

set pages 100select * from group_test;
a6a8a027648818d631370c8237efc6f0.png

02

group by

先看一下普通分组的效果:对group_id进行普通的group by操作---按照小组进行分组

select group_id,sum(salary) from group_test group by group_id;
232047b1aacefc812031a1ac60898bb6.png

03

ROOLUP

对group_id进行普通的roolup操作---按照小组进行分组,同时求总计

select group_id,sum(salary) from group_test group by rollup(group_id);
d17dcd05f58b017077cb6e6cfe1d5650.png

使用Group By语句翻译一下上面的SQL语句如下(union all一个统计所有数据的行):

select group_id,sum(salary) from group_test group by group_idunion allselect null, sum(salary) from group_test order by 1;
52caa92ba3aef779cefbbf17aba3c079.png

04

rollup两列

select group_id,job,sum(salary) from group_test group by rollup(group_id, job);
812657f38b1208f3e2c9f804b1cde2fb.png

上面的SQL语句该如何使用Group By进行翻译呢?

答案如下:

select group_id,job,sum(salary) from group_test group by group_id, job union all select group_id,null,sum(salary) from group_test group by group_id union allselect null,null,sum(salary) from group_test order by 1,2;
e7d60069f86c19e75d7141571e57e93b.png

05

GROUPING函数

select group_id,job,grouping(GROUP_ID),grouping(JOB),sum(salary) from group_test group by rollup(group_id, job);

45f4f5b7d18a661161e936ad3954d7a8.png

说明:

如果显示“1”表示GROUPING函数对应的列(例如JOB字段)是由于ROLLUP函数所产生的空值对应的信息,即对此列进行汇总计算后的结果。

如果显示“0”表示此行对应的这列参未与ROLLUP函数分组汇总活动。

“Using a single column as its argument,GROUPING returns 1 when it encounters a NULL value created by a ROLLUP or CUBEoperation. That is, if the NULL indicates the row is a subtotal, GROUPING returns a 1. Any other type of value, including a stored NULL, returns a 0.”


06

总结

ROLLUP在数据统计和报表生成过程中带来极大的便利,而且效率比起来Group By + Union组合方法效率高得多。这也体现了Oracle在SQL统计分析上人性化、自动化、高效率的特点。

后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注一下~

00f0c78c22db14a9152936d8f4b67268.gif
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值