【问题标题】:Query giving division by zero error in PostgreSQL在 PostgreSQL 中查询除以零错误
【发布时间】:2014-04-08 02:10:00
【问题描述】:

我正在尝试运行以下查询,结果是postgres error: division by zero

select 
    request_count,
    response_count, 
    (response_count*100) / (request_count+response_count) AS proportion 
from total_dummy_table; 

如何避免和解决division by zero 错误?

尝试使用以下查询进行修复,但得到与上述相同的结果

SELECT 
    request_count,
    response_count,
    (response_count*100) / (request_count) AS proportion 
FROM 
    total_dummy_table
ORDER BY 
    (response_count*100) /(CASE request_count WHEN 0 Then NULL ELSE request_count END) DESC NULLS FIRST

请让我知道我哪里做错了,或者我该如何解决这个问题。 谢谢!

结果预期:

查询应该返回如下内容:

Request_count | Response_count | Proportion

1603423       |  585706        | 36.52

快速说明: 表total_dummy_table 没有列名proportion 是对其中已计算比例的结果的加法。

【问题讨论】:

  • 如果request_count+response_count 为零,你想显示什么?
  • 如果 request_count 和 response count 为 0 我希望比例列显示为 0。
  • 在更高级别上执行此操作,请参阅我的答案以获取潜在解决方案...

标签: sql postgresql percentage postgresql-9.2


【解决方案1】:

使用 NULLIF

something/NULLIF(column_name,0)

NULLIF(col,val)

的简写
CASE WHEN col=val THEN NULL ELSE col

【讨论】:

  • 这应该被接受为正确答案。重复分母很乏味。特别是如果它是一个很大的表达,你会感到痛苦,就像@Houari 的回答中那样重复整个分母
  • 我同意,这是更简洁的解决方案。编写 case 语句是不必要的,真正的答案是 Null 而不是 0。
【解决方案2】:
select request_count,response_count, 
case 
    when 
    request_count+response_count = 0 then 0 
    else
(response_count*100) / (request_count+response_count) 
end AS proportion 
from total_dummy_table;

【讨论】:

  • 谢谢你,Hourari,快速的问题,也很愚蠢-根据我的总数是request_count,其中有多少人响应是response_count。所以我的理解是总数必须只是 request_count 而不是它们的加法?正确的?我只是好奇。
  • 这取决于您要计算/显示什么。我的回答是避免divison by zero 错误:)
  • NULLIF 是避免除以零错误的更合适的解决方案,也是更简单的解决方案。我推荐 diego 的答案
  • null如果更好
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多