第8章 SQL高级处理:8-2 GROUPING运算符

■ GROUPING SETS——取得期望的积木
● 只使用GROUP BY子句和聚合函数是无法同时得出小计和合计的。如果想要同时得到,可以使用GROUPING运算符。

● 理解GROUPING运算符中CUBE的关键在于形成“积木搭建出的立方体”的印象。


■同时计算出合计行

如果想要获得那样的结果,通常的做法是分别计算出合计行和按照商品种类进行汇总的结果,然后通过 UNION ALL 连接在一起。
代码清单8-11 分别计算出合计行和汇总结果再通过UNION ALL进行连接

SELECT '合计' AS product_type, SUM(sale_price)
FROM Product
UNION ALL
SELECT product_type, SUM(sale_price)
FROM Product
GROUP BY product_type;

这样一来,为了得到想要的结果,需要执行两次几乎相同的 SELECT语句,再将其结果进行连接,不但看上去十分繁琐,而且 DBMS 内部的处理成本也非常高。

GROUPING 运算符包含以下 3 种。
●ROLLUP
●CUBE
●GROUPING SETS


■ ROLLUP——同时得出合计和小计

■将“登记日期”添加到聚合键当中
 

--Oracle, SQL Server, DB2
SELECT product_type, regist_date, SUM(sale_price) AS sum_price
FROM Product
GROUP BY ROLLUP(product_type, regist_date);

--Oracle, SQL Server, DB2

在上述 GROUP BY 子句中使用 ROLLUP 之后,结果会发生什么变化呢(代码清单 8-14) ?

--MySQL
SELECT product_type, regist_date, SUM(sale_price) AS sum_price
FROM Product
GROUP BY product_type, regist_date WITH ROLLUP;

这 4 行就是我们所说的超级分组记录。也就是说,该SELECT 语句的结果相当于使用 UNION 对如下 3 种模式的聚合级的不同结果进行连接(图 8-5)。

ROLLUP 是“卷起”的意思,可以同时得出合计和小计,是非常方便的工具。


■ GROUPING函数——让NULL更加容易分辨

为了避免混淆, SQL 提供了一个用来判断超级分组记录的 NULL 的
特定函数 —— GROUPING 函数。该函数在其参数列的值为超级分组记录
所产生的 NULL 时返回 1,其他情况返回 0(代码清单 8-15)。

这样就能分辨超级分组记录中的 NULL 和原始数据本身的 NULL 了。

使用 GROUPING 函数还能在超级分组记录的键值中插入字符串。也就是说,
当 GROUPING 函数的返回值为 1 时,指定“合计”或者“小计”等字符串,其他情况返回通常的列的值。


■ CUBE——用数据来搭积木

CUBE 是“立方体”的意思,这个名字和 ROLLUP 一样,都能形象地说明函数的动作。
CUBE 的语法和 ROLLUP 相同,只需要将 ROLLUP 替换为 CUBE 就可以了。


与 ROLLUP 的结果相比, CUBE 的结果中多出了几行记录。大家看一下应该就明白了,多出来的记录就是只把 regist_date 作为聚合键所得到的汇总结果。


顺带说一下, ROLLUP的结果一定包含在CUBE的结果之中。
所谓 CUBE,就是将 GROUP BY 子句中聚合键的“所有可能的组合”的汇总结果集中到一个结果中。
因此,组合的个数就是 2^n(n 是聚合键的个数)。
 

最新文章

  1. Resharper的配置和使用
  2. Duilib源码分析(六)整体流程
  3. while跟do...while的用法
  4. (转抄:人人都是产品经理——iamsujie)如何提高产品规划PPT的能力
  5. 第三方登录 (faceBook )
  6. iOS关于TableViewController和CollectionViewController中self.view心得记录
  7. 导出Excel之Epplus使用教程1(基本介绍)
  8. The content of element type "package" must match "(result-types?,interceptors?...
  9. 基础拾掇之——http基础
  10. AE设置投影而非重投影IGeoDatasetSchemaEdit
  11. 转】启动tomcat时 错误: 代理抛出异常 : java.rmi.server.ExportException: Port already in use: 1099的解决办法
  12. [GIF] GIF Loop Coder Single Mode
  13. vijosP1388 二叉树数
  14. JetBrains公司的IDE使用技巧
  15. http常见错误
  16. Zend Server的WebAPI焦点:异步操作
  17. 常用u-boot命令详解(全)
  18. ssh登录错误ECDSA host key for ip has changed解决方案
  19. Luogu4494 [HAOI2018]反色游戏 【割顶】
  20. UVA - 11468 (AC自动机+动态规划)

热门文章

  1. NIO三大组件简介
  2. 使用Vue+JFinal框架搭建前后端分离系统
  3. 51nod 1055:最长等差数列
  4. Kafka--windows下简单使用kafka命令
  5. 【踩坑记录】记录一次使用Python logging库多进程打印日志的填坑过程
  6. 十、SAP小数需要用引号括起来
  7. 第二阶段scrum-8
  8. html 基础 (9.19 第八天)
  9. UVA - 818 Cutting Chains(切断圆环链)(dfs + 二进制法枚举子集)
  10. 每天一点点之 taro 框架 - 生命周期 & state