露娜卡诗,六安热线,红塔山重金属超标
group by 谁不会啊?这不是最简单的吗?越是简单的东西,我们越会忽略掉他,因为我们不愿意再去深入了解它。
1 小时 sql 极速入门(一)
1 小时 sql 极速入门(二)
1 小时 sql 极速入门(三)——oracle 分析函数
sql 高级查询——(层次化查询,递归)
今天就带大家了解一下group by 的新用法吧。
roll up 搭配 group by 使用,可以为每一个分组返回一个小计行,为所有分组返回一个总计行。
直接看例子,我们有以下数据表,包含工厂列,班组列,数量列三列。
当向 rollup 传入一列时,会得到一个总计行。
select factory, sum(quantity) from production group by rollup(factory) order by factory
结果:
当向 rollup 传递两列时,将会按照这两列进行分组,同时按照第一列的分组结果返回小计行。我们同时传入工厂和部门看一下。
select factory,department, sum(quantity) from production group by rollup(factory, department) order by factory
结果:
可以看到对每一个工厂都有一个小计行,最后对所有的有一个总计行。也可以这样理解
如果 rollup(a,b)则先对 a,b进行 group by,之后对 a 进行 group by,最后对全表 group by。
如果 rollup(a,b,c)则先对 a,b,c进行 group by ,然后对 a,b进行group by,再对 a 进行group by,最后对全表进行 group by.
cube 和 rollup 对参数的处理是不同的,我们可以这样理解。
如果 cube(a,b)则先对 a,b 进行 group by,之后对 a 进行 group by,然后对 b 进行 group by,最后对全表进行 group by.
如果 cube(a,b,c)则先对 a,b,c 进行 group by,之后对 a,b ,之后对a,c ,之后对 b,c 之后对 a,之后对 b,之后对 c,最后对全表group by
看一个简单的例子:
select factory,department, sum(quantity) from production group by cube(factory, department) order by factory,department;
结果:
可以看出来首先对 factory,department进行分组汇总,然后对factory 分组汇总,之后对 department 分组汇总,最后有一行全表汇总。
grouping()函数只能配合 rollup 和 cube 使用,grouping()接收一列,如果此列不为空则返回0,如果为空则返回1.
我们用第一个rollup例子举例
select grouping(factory), factory, department, sum(quantity) from production group by rollup(factory, department) order by factory, department;
结果:
看到,最后一行的 factory 为空,所以 grouping()返回 1.也可以与cube结合使用,方法是一样的。
grouping sets 与 cube 有点类似,cube是对参数进行自由组合进行分组。grouping sets则对每个参数分别进行分组,grouping sets(a,b)就代表先按照 a 分组,再按照 b分组。
select factory, department, sum(quantity) from production group by grouping sets(factory, department) order by factory, department
结果:
可以看出来结果是按照工厂和部门分别分组汇总的。
grouping_id()配合grouping()函数使用,grouping_id(a,b)的值由grouping(a)与grouping(b)的值决定,如果grouping(a)为1,grouping(b)为0,则grouping_id(a,b)的值为 10,十进制的 3.
select factory, department, grouping(factory), grouping(department), grouping_id(factory,department), sum(quantity) from production group by cube(factory, department) order by factory, department;
结果:
有了grouping_id列,我们就可以使用 having 字句来对查询结果进行过滤。选择grouping_id=0的就表示 factory,department两列都不为空。
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
Oracle字符串函数length、upper、lower、initcap、 concat、instr、replace
网友评论