GBase 8a的 group rollup 函数通常用于统计例如商品的明细,小计以及最后总计的场景。通过对不同组合的计算,得到每个层次的计算结果。
目录导航
参考
语法
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)