首页 > 数据库技术 > 详细

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

时间:2020-01-31 16:29:35      阅读:69      评论:0      收藏:0      [点我收藏+]

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




CUBE——用数据来搭积木
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;
View Code

这样一来,为了得到想要的结果,需要执行两次几乎相同的 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;
View Code

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

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


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

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

技术分享图片

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

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

 

 

 

 

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

原文:https://www.cnblogs.com/MarlonKang/p/12245595.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!