南大通用GBase 8a OLAP分析函数group by rollup使用样例

GBase 8a的 group rollup 函数通常用于统计例如商品的明细,小计以及最后总计的场景。通过对不同组合的计算,得到每个层次的计算结果。

参考

GBase 8a窗口函数使用样例索引

语法

GROUP BY ROLLUP( (…),(…),…)

说明

GROUP BY ROLLUP(A,B,C) (A、B、C 代表语法中的“(…)”)
首先会对(A、B、C)进行 GROUP BY,然后对(A、B)进行 GROUP BY,然后是(A)进行 GROUP BY,然后对全表进行 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.00)

拿到每个学生成绩总和

gbase> select name,sum(score) from score group by rollup(name);
+--------+------------+
| name   | sum(score) |
+--------+------------+
| 王海   |        262 |
| 陶俊   |        266 |
| 刘可   |        254 |
| 李春   |        256 |
| NULL   |       1038 |
+--------+------------+
5 rows in set (Elapsed: 00:00:00.06)

每个科目的成绩总和

gbase> select subject,sum(score) from score group by rollup(subject);
+---------+------------+
| subject | sum(score) |
+---------+------------+
| 语文    |        343 |
| 数学    |        333 |
| 英语    |        362 |
| NULL    |       1038 |
+---------+------------+
4 rows in set (Elapsed: 00:00:00.01)

每个学生,每个客户的总和

gbase> select name,subject,sum(score) from score group by rollup(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 |
| NULL   | NULL    |       1038 |
+--------+---------+------------+
17 rows in set (Elapsed: 00:00:00.03)

每个科目,每个学生的成绩总和

请注意和前面的区分,这个关注科目。

gbase> select name,subject,sum(score) from score group by rollup(subject,name);
+--------+---------+------------+
| name   | subject | sum(score) |
+--------+---------+------------+
| 王海   | 语文    |         86 |
| 王海   | 数学    |         83 |
| 王海   | 英语    |         93 |
| 陶俊   | 语文    |         88 |
| 陶俊   | 数学    |         84 |
| 陶俊   | 英语    |         94 |
| 刘可   | 语文    |         80 |
| 刘可   | 数学    |         86 |
| 刘可   | 英语    |         88 |
| 李春   | 语文    |         89 |
| 李春   | 数学    |         80 |
| 李春   | 英语    |         87 |
| NULL   | 语文    |        343 |
| NULL   | 数学    |        333 |
| NULL   | 英语    |        362 |
| NULL   | NULL    |       1038 |
+--------+---------+------------+
16 rows in set (Elapsed: 00:00:00.02)

参考

其它OLAP函数请参考