GBase 8a的group grouping sets功能,对后面括号里的 n 个字段或表达式分别做 GROUP BY 操作,最后将结果合并在一起。等同于多个单独的group by后再做一个union all操作。
目录导航
参考
GBase 8a窗口函数使用样例索引
GBase 8a的grouping函数使用说明和用例
语法
GROUP BY GROUPING SETS( (…),(…),…)
说明
GROUP BY GROUPING SETS (A,B,C) (A、B、C 代表语法中的“(…)”)
首先对(A)进行 GROUP BY,然后对(B)进行 GROUP BY,然后对(C)进行 GROUP BY,最后将所有结果合并在一起(相当于 UNION ALL 操作),如果 n 个字段或表达式中的一个或多个在某一分组中不出现在 GROUP BY 后面,用 NULL 代替不出现的字段或表达式。
样例
数据样例
简单的学生科目考试记录。
gbase> select * from score;
+--------+---------+-------+
| name | subject | score |
+--------+---------+-------+
| 王海 | 语文 | 86 |
| 王海 | 数学 | 83 |
| 王海 | 英语 | 93 |
| 陶俊 | 语文 | 88 |
| 陶俊 | 数学 | 84 |
| 陶俊 | 英语 | 94 |
| 刘可 | 语文 | 80 |
| 刘可 | 数学 | 86 |
| 刘可 | 英语 | 88 |
| 李春 | 语文 | 89 |
| 李春 | 数学 | 80 |
| 李春 | 英语 | 87 |
+--------+---------+-------+
12 rows in set (Elapsed: 00:00:00.01)
获得学生和学科各自的汇总结果
gbase> select name,subject,sum(score) from score group by grouping sets(name,subject);
+--------+---------+------------+
| name | subject | sum(score) |
+--------+---------+------------+
| NULL | 语文 | 343 |
| NULL | 数学 | 333 |
| NULL | 英语 | 362 |
| 王海 | NULL | 262 |
| 陶俊 | NULL | 266 |
| 刘可 | NULL | 254 |
| 李春 | NULL | 256 |
+--------+---------+------------+
7 rows in set (Elapsed: 00:00:00.02)
多个Sets之间也是union all关系。本例就简单的将上一个用例的2个条件,拆分一下。结果是一样的。
gbase> select name,subject,sum(score) from score group by grouping sets((name),(subject));
+--------+---------+------------+
| name | subject | sum(score) |
+--------+---------+------------+
| NULL | 语文 | 343 |
| NULL | 数学 | 333 |
| NULL | 英语 | 362 |
| 王海 | NULL | 262 |
| 陶俊 | NULL | 266 |
| 刘可 | NULL | 254 |
| 李春 | NULL | 256 |
+--------+---------+------------+
7 rows in set (Elapsed: 00:00:00.02)
gbase> select name,subject,sum(score) from score group by grouping sets(name,(name,subject));
+--------+---------+------------+
| name | subject | sum(score) |
+--------+---------+------------+
| 王海 | 语文 | 86 |
| 王海 | 数学 | 83 |
| 王海 | 英语 | 93 |
| 陶俊 | 语文 | 88 |
| 陶俊 | 数学 | 84 |
| 陶俊 | 英语 | 94 |
| 刘可 | 语文 | 80 |
| 刘可 | 数学 | 86 |
| 刘可 | 英语 | 88 |
| 李春 | 语文 | 89 |
| 李春 | 数学 | 80 |
| 李春 | 英语 | 87 |
| 王海 | NULL | 262 |
| 陶俊 | NULL | 266 |
| 刘可 | NULL | 254 |
| 李春 | NULL | 256 |
+--------+---------+------------+
16 rows in set (Elapsed: 00:00:00.04)
如上第二个例子中,第一部分是name, 第二部分是(name,subject)两个字段一起。
注意,不考虑重复,也就是你可以写多个name。
gbase> select name,subject,sum(score) from score group by grouping sets(name,name,subject);
+--------+---------+------------+
| name | subject | sum(score) |
+--------+---------+------------+
| NULL | 语文 | 343 |
| NULL | 数学 | 333 |
| NULL | 英语 | 362 |
| 王海 | NULL | 262 |
| 陶俊 | NULL | 266 |
| 刘可 | NULL | 254 |
| 李春 | NULL | 256 |
| 王海 | NULL | 262 |
| 陶俊 | NULL | 266 |
| 刘可 | NULL | 254 |
| 李春 | NULL | 256 |
+--------+---------+------------+
11 rows in set (Elapsed: 00:00:00.03)