You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 23:42:19