在实际开发过程中,对数据进行的查询,常常是不仅要查询数据本身,还要对其进行分组查询。这时候最简单的方法是进行多次查询后将数据合并。但使用grouping可以更方便简洁地进行上述查询。
假设有如下数据表:
create table student(
id varchar2(32) primary key,
class varchar2(32),
name varchar2(32),
sex varchar2(32),
score integer);
insert into student values('20110101','1','张三','男',90);
insert into student values('20110102','1','李四','男',95);
insert into student values('20110103','1','小明','男',95);
insert into student values('20110104','1','李娜','女',93);
insert into student values('20110105','1','小茜','女',93);
insert into student values('20110201','2','张龙','男',90);
insert into student values('20110202','2','赵虎','男',95);
insert into student values('20110203','2','小倩','女',95);
insert into student values('20110204','2','珊珊','女',94);
insert into student values('20110205','2','小沐','女',94);
commit;
查询所有学生的成绩及按班级、性别分组后的平均成绩:
select id,
class,
decode(grouping_id(class, sex, name),
7,
'总平均',
3,
class || '班平均',
1,
class || '班' || sex || '生平均',
name) sname,
sex,
avg(score)
from student t
group by grouping sets((),(class),(class, sex),(class, sex, name, id))
order by grouping_id(class, sex, name), class, id
得到如下结果:
可以看到,只要通过一次查询就得到了数据本身和各种分组数据。下面说明用到的特殊语句和函数:
1.group by grouping sets((),(class),(class, sex),(class, sex, name, id))
grouping sets 相当与将多个group by的分组条件合并,空的分组条件则是所有数据的总合计。上述语句就相当于查询时没有group条件、使用group by(class)、group by(class,sex)、
group by(class, sex, name, id)这四种情况下查询得到的数据合并到一起。
2.grouping_id(class, sex, name)
grouping_id(arg)函数判断其参数是否参与了分组,如果没有参与则返回1,如果参与了分组则返回0,如在本例中grouping_id(class)在除了总合计以外的结果集中class都参与了分组,即grouping_id(class)在第1~16行返回0,第17行返回1。而其多个参数的形式则将其每个参数进行grouping_id(arg)运算后返回的值拼成二进制后转换为十进制返回,即grouping_id(argn,...,arg2,arg1)=grouping_id(argn)*2^(n-1)+...+grouping_id(arg2)*2^1+grouping_id(arg1)*2^0('^'表示幂运算)。
在上述示例中,在1~10行结果相当于group by(class, sex, name, id)返回的结果,此时grouping_id(class, sex, name)的所有参数参与了分组,则返回值为(000)二进制=(0)十进制;第11~14行相当于group by(class,sex)的结果,此时class和sex参与了分组,grouping_id(class, sex, name)返回值为(001)二进制=(1)十进制;第15、16行相当于group by(class),此时class参与了分组,grouping_id(class, sex, name)返回值为(011)二进制=(3)十进制;而第17行相当于没有group条件,此时没有分组参数,则grouping_id(class, sex, name)返回值为(111)二进制=(7)十进制。
3.decode(grouping_id(class, sex, name),7, '总平均',3,class || '班平均',1,class || '班' || sex || '生平均',name)
decode(condition,arg1,return1,arg2,return2,...,argn,returnn,default)相当于如下语句:
if(condition = arg1) {
return return1;
}else if(condition = arg2) {
return return2;
}
......
else if(condition = argn) {
return returnn;
}else {
return defualt;
}
- 大小: 65.3 KB
分享到:
相关推荐
extJs grouping分组源码 类似qq分组功能
使用GROUP BY语句时,你一般得不到多级总数。可以用GROUP BY GROUPING SETS来代替GROUP BY CUBE。你可以应用来指定你感兴趣的总数组合。因为它不必计算它不需要集合(也不会产生太多结果),所以对SQL引擎来说更为...
主要是介绍在 JDK8中使用 stream 流的 groupingBy 方法源进行最大值分组、最小值分组、平均值分组、统计分组
lucene-grouping-3.5.0.jar分组统计+分类统计插件 分组统计+分类统计
主要介绍了Java8 stream 中利用 groupingBy 进行多字段分组求和案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
grouping or grouping_id
赠送jar包:lucene-grouping-6.6.0.jar; 赠送原API文档:lucene-grouping-6.6.0-javadoc.jar; 赠送源代码:lucene-grouping-6.6.0-sources.jar; 赠送Maven依赖信息文件:lucene-grouping-6.6.0.pom; 包含翻译后...
主要是在存储过程中grouping 的使用方法
资源文件分组插件
为了实现DataGrid分组的汇总功能折腾了一天 发现用转换器就可以轻松实现 基础很重要呃
spout与bolt设置多重grouping,
关于with cube ,with rollup 和 grouping 通过查看sql 2005的帮助文档找到了CUBE 和 ROLLUP 之间的具体区别: CUBE 生成的结果集显示了所选列中值的所有组合的聚合。ROLLUP 生成的结果集显示了所选列中值的某一层次...
ROLLUP是GROUP BY子句的扩展,它是为每一个分组返回一条合计记录,并为全部分组返回总计。 2.CUBE子句也是对GROUP BY子句进行扩展,返回CUBE中所有列组合的小计信息,同时在最后显示总计信息。 3.GROUPING()函数...
3,使用grouping sets 自定义分组集单个分组的集合是分组集, 分组集 grouping sets((a),(a,b)) :表示两个分组 (a,b),
A Grouping Particle Swarm Optimizer with Personal-Best-Position
grouping 实例Grouping and Virtualization
提议数组分组 使数组中的项目分组更容易的建议。 const array = [ 1 , 2 , 3 , 4 , 5 ] ; // groupBy groups items by arbitrary key. // In this case, we're grouping by even/odd keys array . groupBy ( i => ...
模糊聚类FCM 能够实现数据的分类与分组,确定聚类数,进行模糊划分
GROUP BY子句(rollup,cube,grouping sets)实例说明
中文-英文对照文档,中英对照文档,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压 【***.jar中文文档.zip】,再解压其中的 【***-...