暂无图片
分享
Danny
2022-05-30
GBase 8a 中group by grouping sets函数怎么使用?

GBase 8a 中group by grouping sets函数怎么使用?

收藏
分享
1条回答
默认
最新
生命之源
2022-05-30

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)
暂无图片 评论
暂无图片 有用 0
打赏 0
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏