grouping sets/rollup/cube用法
 
                  更新时间 2025-02-14 10:22:17
                 
 
                    最近更新时间: 2025-02-14 10:22:17
                  
 本页介绍天翼云TeleDB数据库的grouping sets/rollup/cube用法。
 group by用法
- 销售明细表 - create table t_grouping(id int,dep varchar(20),product varchar(20),num int); insert into t_grouping values(1,'业务1部','手机',90); insert into t_grouping values(2,'业务1部','电脑',80); insert into t_grouping values(3,'业务1部','手机',70); insert into t_grouping values(4,'业务2部','电脑',60); insert into t_grouping values(5,'业务2部','手机',50); insert into t_grouping values(6,'业务2部','电脑',60); insert into t_grouping values(7,'业务3部','手机',70); insert into t_grouping values(8,'业务3部','电脑',80); insert into t_grouping values(9,'业务3部','手机',90);
- 按dep、product 两级汇总分数。 - teledb=# select dep,product,sum(num) from t_grouping group by dep,product order by dep,product; dep | product | sum ---------+---------+----- 业务1部 | 电脑 | 80 业务1部 | 手机 | 160 业务2部 | 电脑 | 120 业务2部 | 手机 | 50 业务3部 | 电脑 | 80 业务3部 | 手机 | 160
使用grouping sets
grouping sets的每个子列表可以指定零个或多个列或表达式,并且与其直接在 GROUP BY 子句中的解释方式相同。 一个空的分组集合意味着所有的行都被聚合到一个组中。
如按name、class 单级分别汇总,再计算一个总分。
teledb=# select dep,product,sum(num) from t_grouping group by grouping sets((dep),(product),()) order by dep,product;
dep   | product | sum 
---------+---------+-----
业务1部 |         | 240
业务2部 |         | 170
业务3部 |         | 240
| 电脑    | 280
| 手机    | 370
|         | 650
(6 rows)使用grouping sets 代替 group by 。
teledb=# select dep,product,sum(num) from t_grouping group by grouping sets((dep,product)) order by dep,product;
dep  | product | sum 
---------+---------+-----
业务1部 | 电脑   |  80
业务1部 | 手机   | 160
业务2部 | 电脑   | 120
业务2部 | 手机   |  50
业务3部 | 电脑   |  80
业务3部 | 手机   | 160使用rollup
rollup((a),(b)) 等价于 grouping sets((a,b),(a),())。
teledb=# select dep,product,sum(num) from t_grouping group by rollup((dep),(product)) order by dep,product;
dep  | product | sum 
---------+---------+-----
业务1部 | 电脑   |  80
业务1部 | 手机   | 160
业务1部 |     | 240
业务2部 | 电脑   | 120
业务2部 | 手机   |  50
业务2部 |     | 170
业务3部 | 电脑   |  80
业务3部 | 手机   | 160
业务3部 |     | 240
|     | 650该功能等价于grouping sets((dep, product),( dep),())。
teledb=# select dep,product,sum(num) from t_grouping group by grouping sets((dep, product),( dep),()) order by dep,product;
dep   | product | sum 
---------+---------+-----
业务1部 | 电脑    |  80
业务1部 | 手机    | 160
业务1部 |         | 240
业务2部 | 电脑    | 120
业务2部 | 手机    |  50
业务2部 |         | 170
业务3部 | 电脑    |  80
业务3部 | 手机    | 160
业务3部 |         | 240
|         | 650
(10 rows)使用cube
cube((a),(b)) 等价于 grouping sets((a,b),(a),(b),()) 。
teledb=# select dep,product,sum(num) from t_grouping group by cube((dep),(product)) order by dep,product;
dep   | product | sum 
---------+---------+-----
业务1部 | 电脑    |  80
业务1部 | 手机    | 160
业务1部 |         | 240
业务2部 | 电脑    | 120
业务2部 | 手机    |  50
业务2部 |         | 170
业务3部 | 电脑    |  80
业务3部 | 手机    | 160
业务3部 |         | 240
| 电脑    | 280
| 手机    | 370
|         | 650
(12 rows)该功能等价于grouping sets((name,class),(name),(class),())。
teledb=# select dep,product,sum(num) from t_grouping group by grouping sets((dep,product),(dep),(product),()) order by dep,product;   dep   | product | sum 
---------+---------+-----
业务1部 | 电脑    |  80
业务1部 | 手机    | 160
业务1部 |         | 240
业务2部 | 电脑    | 120
业务2部 | 手机    |  50
业务2部 |         | 170
业务3部 | 电脑    |  80
业务3部 | 手机    | 160
业务3部 |         | 240
| 电脑    | 280
| 手机    | 370
|         | 650
(12 rows)