SQL基础教程(第2版)第8章 SQL高级处理:8-2 GROUPING运算符

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

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

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


同时计算出合计行

SQL基础教程(第2版)第8章 SQL高级处理:8-2 GROUPING运算符_第1张图片

如果想要获得那样的结果,通常的做法是分别计算出合计行和按照商品种类进行汇总的结果,然后通过 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;
View Code

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

 

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


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

SQL基础教程(第2版)第8章 SQL高级处理:8-2 GROUPING运算符_第2张图片

将“登记日期”添加到聚合键当中
 SQL基础教程(第2版)第8章 SQL高级处理:8-2 GROUPING运算符_第3张图片

--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;
View Code

4 行就是我们所说的超级分组记录。也就是说,该SELECT 语句的结果相当于使用 UNION 对如下 种模式的聚合级的不同结果进行连接(图 8-5)。
SQL基础教程(第2版)第8章 SQL高级处理:8-2 GROUPING运算符_第4张图片

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


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

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

SQL基础教程(第2版)第8章 SQL高级处理:8-2 GROUPING运算符_第5张图片

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

使用 GROUPING 函数还能在超级分组记录的键值中插入字符串。也就是说,
GROUPING 函数的返回值为 1 时,指定“合计”或者“小计”等字符串,其他情况返回通常的列的值。
SQL基础教程(第2版)第8章 SQL高级处理:8-2 GROUPING运算符_第6张图片


 ■ CUBE——用数据来搭积木

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

SQL基础教程(第2版)第8章 SQL高级处理:8-2 GROUPING运算符_第7张图片
SQL基础教程(第2版)第8章 SQL高级处理:8-2 GROUPING运算符_第8张图片

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

SQL基础教程(第2版)第8章 SQL高级处理:8-2 GROUPING运算符_第9张图片
顺带说一下, ROLLUP的结果一定包含在CUBE的结果之中。
所谓 CUBE,就是将 GROUP BY 子句中聚合键的“所有可能的组合”的汇总结果集中到一个结果中。
因此,组合的个数就是 2^nn 是聚合键的个数)。
SQL基础教程(第2版)第8章 SQL高级处理:8-2 GROUPING运算符_第10张图片 

你可能感兴趣的:(SQL基础教程(第2版)第8章 SQL高级处理:8-2 GROUPING运算符)