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)