GROUPING

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

合计行是不指定聚合键时得到的汇总结果。

GROUPING 运算符包含以下3 种

●ROLLUP
●CUBE
●GROUPING SETS

⚪ ROLLUP的使用方法

ROLLUP 是“卷起”的意思,名称也形象地说明了该操作能够得到像从小计到合计这样,从最小的聚合级开始,聚合单位逐渐扩大的结果。

一个聚合键的情况:

  GROUP BY ROLLUP (某聚合键)  =  (一般情况)以下两种组合的汇总结果。      相当于下面的两个查询UNION起来

  ① GROUP BY ()
  ② GROUP BY (某聚合键)

  ①中的GROUP BY () 表示没有聚合键,也就相当于没有GROUP BY子句(这时会得到全部数据的合计行的记录),该合计行记录称为超级分组记录Super Group Row)。把它当作未使用GROUP BY 的合计行来理解超级分组记录的product_type列的键值(对DBMS 来说)并不明确,因此会默认使用NULL。

     

两个聚合键的情况:

GROUP BY ROLLUP (A聚合键, B聚合键)  =  (一般情况)以下三种组合的汇总结果。    相当于下面的三个查询UNION起来

    ① GROUP BY ()

    ② GROUP BY (A聚合键)

    ③ GROUP BY (A聚合键, B聚合键)

对比不用ROLLUP,使用ROLLUP 时多出了最上方的合计行以及3 条不同商品种类的小计行(也就是未使用登记日期作为聚合键的记录),这4 行就是我们所说的超级分组记录。也就是说,该SELECT 语句的结果相当于使用UNION 对如上3 种模式的聚合级的不同结果进行连接。

总结:ROLLUP可以同时得出合计和小计,是非常方便的工具。

GROUPING 函数——用来判断超级分组记录的NULL 的特定函数

该函数在其参数列的值为超级分组记录所产生的NULL 时返回1其他情况返回0。使用GROUPING函数能够简单地分辨出原始数据中的NULL和超级分组记录中的NULL。

⚪ CUBE——用数据来搭积木

与ROLLUP 的结果相比,CUBE 的结果中多出了几行记录。

多出来的记录就是只把regist_date 作为聚合键所得到的汇总结果。

GROUP BY CUBE (A聚合键, B聚合键)  =  (一般情况)以下四种组合的汇总结果。

① GROUP BY ()
② GROUP BY (product_type)
③ GROUP BY (regist_date) ←添加的组合
④ GROUP BY (product_type, regist_date)

所谓CUBE,就是将GROUP BY 子句中聚合键的“所有可能的组合”的汇总结果集中到一个结果中。因此,组合的个数就是2的n次幂(n 是聚合键的个数)。

使用ROLLUP时组合的个数是n + 1。随着组合个数的增加,结果的行数也会增加,因此如果使用CUBE时不加以注意的话,往往会得到意想不到的巨大结果,ROLLUP的结果一定包含在CUBE的结果之中。

总结:可以把CUBE理解为将使用聚合键进行切割的模块堆积成一个立方体。

 ⚪ GROUPING SETS——取得期望的积木

GROUPING SETS 可以用于从ROLLUP 或者CUBE 的结果中取出部分记录。

与ROLLUP 或者CUBE 能够得到规定的结果相对,GROUPING SETS 用于从中取出个别条件对应的不固定的结果。

原文地址:https://www.cnblogs.com/philipchan/p/14340313.html