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

PostgreSQL:计算平均占用率时如何避免除零错误?

解决SQL中的除零错误并得到预期的平均占用率

嘿,我完全懂你碰到的麻烦——当capacity列出现0时,直接做除法肯定会触发"division by zero"错误,而且你还希望特定场景返回NULL,正好NULLIF就是解决这类问题的利器!我来一步步教你调整SQL代码。

第一步:用NULLIF规避除零错误

核心思路是把capacity用NULLIF(capacity, 0)替换,这样当capacity为0时,它会被转换成NULL,除法运算遇到NULL会直接返回NULL,不会抛出错误。先写出基础修正版:

SELECT 
  occupancy,
  capacity,
  AVG((occupancy / NULLIF(capacity, 0)) * 100) AS avg_occupancy_rate
FROM occu_cap
GROUP BY occupancy, capacity;

第二步:匹配你的预期结果(处理occupancy为0的场景)

看你的示例,当occupancy是0但capacity非0时(比如0 | 658),你希望返回NULL而不是0。上面的代码会得到0,所以我们再加一层NULLIF处理这种情况:

SELECT 
  occupancy,
  capacity,
  AVG(NULLIF((occupancy / NULLIF(capacity, 0)) * 100, 0)) AS avg_occupancy_rate
FROM occu_cap
GROUP BY occupancy, capacity;

这样调整后:

  • 当capacity为0时,NULLIF(capacity, 0)返回NULL,整个表达式结果为NULL
  • 当occupancy为0且capacity非0时,(0/capacity)*100得到0,NULLIF(..., 0)会把它转换成NULL
  • 正常非0场景会正确计算出占用率,比如1232/1630*100≈75.58

验证示例数据

用你提供的测试数据运行,结果会和预期完全一致:

occupancycapacityavg_occupancy_rate
1232163075.58
0658NULL
00NULL

小补充

  • NULLIF(a, b)的逻辑是:如果a等于b,返回NULL,否则返回a
  • AVG()函数会自动忽略NULL值,不会影响其他正常数据的计算(你的分组逻辑里每个组只有一行数据,所以AVG实际就是返回单值)

内容的提问来源于stack exchange,提问作者Ben Watson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 18:19:08