如何在PostgreSQL中基于两列计算各分类open状态的百分比
PostgreSQL 分类占比查询实现方案
你可以通过条件聚合搭配PostgreSQL内置的格式化函数实现需求,具体SQL如下:
SELECT category, -- 格式化输出:将小数分隔符替换为逗号,添加百分号 REPLACE( TO_CHAR( -- 计算open值占总值得百分比,转numeric避免整数除法丢失精度 (SUM(CASE WHEN status = 'open' THEN value ELSE 0 END)::NUMERIC / SUM(value)::NUMERIC) * 100, 'FM999D99%' ), '.', ',' ) AS percentage FROM table1 GROUP BY category ORDER BY category;
逻辑说明
- 用
CASE WHEN status = 'open' THEN value ELSE 0 END筛选出open状态的value值,配合SUM聚合得到每个分类下open的总数值 - SUM(value)直接计算每个分类所有状态的value总和
- 转NUMERIC类型是为了避免PostgreSQL整数除法默认舍去小数的问题,保证计算精度
- TO_CHAR函数用于将计算得到的百分比数值格式化为带百分号的字符串,FM修饰符可以去掉结果中多余的前导空格
- 最后用REPLACE将默认的小数点替换为逗号,匹配你需要的输出格式
如果你的示例期望结果存在手误,只需要调整CASE WHEN里的status取值即可匹配对应计算逻辑。
内容的提问来源于stack exchange,提问作者nomnom3214
相关产品推荐
相关产品推荐

