SQL速率(百分比)计算 - 除以零错误

问题描述 投票:0回答:2

尝试用户NULLIF或IFNULL函数,但仍然接收除零消息。

SELECT 
client_id
,COUNT(distinct CASE WHEN status = 'failed' THEN id END) AS count_FAILS
,COUNT(distinct CASE WHEN status = 'completed' THEN id END) AS count_COMPLETED
,COUNT(distinct CASE WHEN status IN ('failed') THEN id END)
 /CAST(COUNT(CASE WHEN status = 'completed' THEN id END) AS FLOAT) 

FROM journey
GROUP BY 1

示例数据库和查询https://dbfiddle.uk/?rdbms=postgres_10&fiddle=efc0cd25843e852ab7a3aa8fe49e6986

这种查询是否有必要?

谢谢!

sql postgresql rate
2个回答
1
投票

这应该工作:

COUNT(distinct CASE WHEN status IN ('failed') THEN id END) * 1.0 /
NULLIF(COUNT(CASE WHEN status = 'completed' THEN id END), 0)

你可以施放到浮子上。我更喜欢使用* 1.0

我注意到count_completed的定义使用count(distinct),但这个比例没有。这可能是一个错误。

我更有可能想要整体失败状态的比例,而不是比率。如果这是可以接受的,并且COUNT(DISTINCT)对于任何一个计数都不是必需的,那么这可以简化为:

avg( (status = 'failed')::int )

1
投票

你可以使用NULLIF

,COUNT(distinct CASE WHEN status IN ('failed') THEN id END)/
 NULLIF(CAST(COUNT(CASE WHEN status = 'completed' THEN id END) AS FLOAT),0) 

DBFidde Demo


我会将整个查询重写为:

SELECT 
  client_id
  ,COUNT(distinct id) FILTER(WHERE status = 'failed') AS count_FAILS
  ,COUNT(distinct id) FILTER(WHERE status = 'completed') AS count_COMPLETED
  ,COUNT(distinct id) FILTER(WHERE status = 'failed')
   /NULLIF(1.0 * COUNT(distinct id) FILTER(WHERE status = 'completed'),0)
FROM journey
GROUP BY client_id;

DBFiddle Demo2

© www.soinside.com 2019 - 2024. All rights reserved.