暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

GBase 8a OLAP函数group by grouping sets的使用样例

生命之源 2022-05-30
529

GBase 8a的group grouping sets功能,对后面括号里的 n 个字段或表达式分别做 GROUP BY 操作,最后将结果合并在一起。等同于多个单独的group by后再做一个union all操作。


语法

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)
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
1人已赞赏
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论