GROUP BY你都不会!ROLLUP,CUBE,GROUPPING详解

栏目: 数据库 · 发布时间: 5年前

内容简介:今天就带大家了解一下Group By 的新用法吧。ROLL UP 搭配 GROUP BY 使用,可以为每一个分组返回一个小计行,为所有分组返回一个总计行。直接看例子,我们有以下数据表,包含工厂列,班组列,数量列三列。

Group By

Group By 谁不会啊?这不是最简单的吗?越是简单的东西,我们越会忽略掉他,因为我们不愿意再去深入了解它。

1 小时 SQL 极速入门(一)

1 小时 SQL 极速入门(二)

1 小时 SQL 极速入门(三)——Oracle 分析函数

SQL 高级查询——(层次化查询,递归)

今天就带大家了解一下Group By 的新用法吧。

ROLL UP

ROLL UP 搭配 GROUP BY 使用,可以为每一个分组返回一个小计行,为所有分组返回一个总计行。

直接看例子,我们有以下数据表,包含工厂列,班组列,数量列三列。

GROUP BY你都不会!ROLLUP,CUBE,GROUPPING详解

当向 ROLLUP 传入一列时,会得到一个总计行。

SELECT factory,
  SUM(quantity)
FROM production
GROUP BY ROLLUP(factory)
ORDER BY factory

结果:

GROUP BY你都不会!ROLLUP,CUBE,GROUPPING详解

当向 ROLLUP 传递两列时,将会按照这两列进行分组,同时按照第一列的分组结果返回小计行。我们同时传入工厂和部门看一下。

SELECT factory,department,
  SUM(quantity)
FROM production
GROUP BY ROLLUP(factory, department)
ORDER BY factory

结果:

GROUP BY你都不会!ROLLUP,CUBE,GROUPPING详解

可以看到对每一个工厂都有一个小计行,最后对所有的有一个总计行。也可以这样理解

如果 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

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;

结果:

GROUP BY你都不会!ROLLUP,CUBE,GROUPPING详解

可以看出来首先对 FACTORY,DEPARTMENT进行分组汇总,然后对FACTORY 分组汇总,之后对 DEPARTMENT 分组汇总,最后有一行全表汇总。

GROUPING

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;

结果:

GROUP BY你都不会!ROLLUP,CUBE,GROUPPING详解

看到,最后一行的 FACTORY 为空,所以 GROUPING()返回 1.也可以与CUBE结合使用,方法是一样的。

GROUPING SETS

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

结果:

GROUP BY你都不会!ROLLUP,CUBE,GROUPPING详解

可以看出来结果是按照工厂和部门分别分组汇总的。

GROUPING_ID()

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;

结果:

GROUP BY你都不会!ROLLUP,CUBE,GROUPPING详解

有了GROUPING_ID列,我们就可以使用 HAVING 字句来对查询结果进行过滤。选择GROUPING_ID=0的就表示 FACTORY,DEPARTMENT两列都不为空。


以上所述就是小编给大家介绍的《GROUP BY你都不会!ROLLUP,CUBE,GROUPPING详解》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Ruby on Rails社区网站开发

Ruby on Rails社区网站开发

布拉德伯纳 / 柳靖 / 2008-10 / 55.00元

《Ruby on Rails社区网站开发》全面探讨创建完整社区网站的开发过程。首先介绍开发一个内容简单的管理系统,之后逐渐添加新特性,以创建更完整的、使用Ruby on Rails 的Web 2.0 社区网站。还给出了开发和测试中的一些建议和提示,同时指导如何使网站更生动以及维护得更好。《Ruby on Rails社区网站开发》也探讨了如何与Flickr 、Google Maps 等其他平台集成,......一起来看看 《Ruby on Rails社区网站开发》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器