PostgreSQL如何将未定义分组数据聚合到指定组(无需多子查询)
PostgreSQL 分组统计:将指定类别聚合到Other组的优化实现
数据表结构与测试数据
首先修正原数据表创建语句(PostgreSQL中无number类型,替换为numeric):
CREATE TABLE DataTable ( name text, value numeric ); INSERT INTO DataTable VALUES ('A', 1),('A', 2),('B', 3),('Other', 5),('C', 1);
需求说明
需要按A、B、Other分组统计value的总和,其中C类别需合并到Other组,预期输出:
Name | sum A | 3 B | 3 Other | 6
原实现使用两个子查询,但业务查询包含多关联与聚合时,重复代码会导致维护困难,现提供无需多子查询的实现方案。
优化实现方案
使用CASE语句在分组前对name字段进行重映射,直接完成分组聚合,无需嵌套子查询:
SELECT CASE WHEN name IN ('A', 'B') THEN name ELSE 'Other' END AS "Name", SUM(value) AS "sum" FROM DataTable GROUP BY CASE WHEN name IN ('A', 'B') THEN name ELSE 'Other' END;
简化写法
PostgreSQL支持按SELECT列表的位置分组,可进一步简化代码,避免重复CASE逻辑:
SELECT CASE WHEN name IN ('A', 'B') THEN name ELSE 'Other' END AS "Name", SUM(value) AS "sum" FROM DataTable GROUP BY 1;
方案说明
- 通过
CASE语句将非A、B的所有类别(包括C和原Other)统一映射为Other - 直接基于映射后的字段分组求和,代码简洁且避免重复逻辑,后续维护只需修改
CASE中的条件即可
内容的提问来源于stack exchange,提问作者Marko Taht
相关产品推荐
相关产品推荐

