Расчет скорости (процента) SQL - деление на ноль ошибок - PullRequest
0 голосов
/ 25 августа 2018

Пытался использовать функции 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

Является ли отчетливо необходимым для таких запросов?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 25 августа 2018

Это должно работать:

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 )
0 голосов
/ 25 августа 2018

Вы можете использовать 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


Я бы переписал весь запрос так:

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

...