grouping sets/rollup/cube用法
更新時間 2025-02-14 10:25:02
最近更新時間: 2025-02-14 10:25:02
分享文章
本頁介紹天翼云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)