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)