PostgreSQL中如何计算指定条件记录数占总记录数的比率
原SQL错误原因
- 你定义的CTE
t仅返回1行记录(即phase为'sold'的总计数),后续对t表执行count(*)永远得到结果1,最终计算的是sold总数/1,和你要的sold总数/全表总数逻辑完全不符。 - PostgreSQL中整数类型之间做除法会直接截断小数部分,就算计数逻辑正确,
2/4的整数除法结果会是0,无法得到0.5的正确比例值,需要先把计数转成数值类型再做除法。 - 额外注意:
table是SQL保留关键字,如果你的表名真的是table,查询时需要用双引号包裹写成"table",否则会触发语法错误。
正确实现写法
推荐使用单次表扫描的条件聚合写法,执行效率最高,不需要多次查同一张表:
SELECT ROUND( COUNT(CASE WHEN phase = 'sold' THEN 1 END)::NUMERIC / COUNT(*) * 100, 2 ) AS sold_percent FROM your_table; -- 这里替换成你实际的表名
代码逻辑说明:
COUNT(CASE WHEN phase = 'sold' THEN 1 END):仅统计phase值为'sold'的记录数,不满足条件的记录CASE返回NULL,COUNT会自动忽略NULL值- 计算时把分子转成
NUMERIC类型避免整数除法截断,乘以100后保留2位小数,输出的就是百分比结果 - 针对你给出的样例数据,该语句执行结果为50,和预期一致。
如果你更习惯用CTE拆分逻辑的写法,可以参考下面的版本(注意需要分别统计sold数量和全表总数量):
WITH sold_stat AS ( SELECT COUNT(*) AS total_sold FROM your_table WHERE phase = 'sold' ), all_stat AS ( SELECT COUNT(*) AS total_all FROM your_table ) SELECT ROUND(total_sold::NUMERIC / total_all * 100, 2) AS sold_percent FROM sold_stat, all_stat;
内容的提问来源于stack exchange,提问作者Katty_one
相关产品推荐
相关产品推荐

