posgre sql исключить результаты ошибки нулевого деления - PullRequest
0 голосов
/ 27 февраля 2020

Я выполняю запрос, но для сумм случаев

SUM( CASE WHEN dismissal_kind = 'caught' THEN 1 ELSE 0 END )

эта часть кода обнуляется, что приводит к ошибке деления на ноль. Я пытаюсь не показывать результат (не выбирать), когда

SUM( CASE WHEN dismissal_kind = 'caught' THEN 1 ELSE 0 END )

Pease help.

"""select distinct bowler as b,
    count(bowler)/SUM( CASE WHEN dismissal_kind = 'caught' THEN 1 ELSE 0 END ) from deliveries
    group by bowler; """

Ответы [ 2 ]

1 голос
/ 27 февраля 2020

Вы можете сделать это таким образом, используя case, когда: в моем примере я установил значение по умолчанию на 0, но вы можете иметь значение по умолчанию, отличающееся в зависимости от вашего варианта использования

select distinct bowler as b,
    case when SUM( CASE WHEN dismissal_kind = 'caught' THEN 1 ELSE 0 END ) <> 0
    then
       count(bowler)/SUM( CASE WHEN dismissal_kind = 'caught' THEN 1 ELSE 0 END ) 
    else
    0
   end 
from deliveries
    group by bowler;
0 голосов
/ 27 февраля 2020

Самый простой способ - удалить else 0:

SUM( CASE WHEN dismissal_kind = 'caught' THEN 1 END )

. Возвращает NULL, если ничего не соответствует условию. При делении на NULL получается NULL, а не ошибка.

Однако для вашего запроса я рекомендую:

select bowler as b,
       count(*) / nullif(count(*) filter (where dismissal_kind = 'caught'), 0)
from deliveries
group by bowler;

nullif() - это еще один способ избежать деления на ноль. filter является рекомендуемым (и стандартным) синтаксисом для условного агрегирования.

Если вы хотите отфильтровать строки, которые являются null, вы можете включить предложение having:

select bowler as b,
       count(*) / nullif(count(*) filter (where dismissal_kind = 'caught'), 0)
from deliveries
group by bowler
having count(*) filter (where dismissal_kind = 'caught') > 0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...