Вычисление процента, когда строка может содержать 0

Ранее я задавал следующий вопрос: Вычисление процента в SQL

Теперь мне посчастливилось получить отличный ответ, однако в своем вопросе я не учел, что мои строки могут содержать ноль.

Ряд вопросов, где просто:

select 
Number_of_Calls,
Number_of_Answered,
((Number_of_answered/Number_Of_Calls)*100) as answer_percent,
Date
from table Where Date BETWEEN '2012-09-10' AND '2012-09-11'

Однако Number_of_answered может быть равен нулю (если наша компания не отвечала на звонки), поэтому, если мне нужно полное число в процентах, как мне принять во внимание 0?

Кстати. База данных, которую мы используем, представляет собой базу данных Oracle с PL SQL.


person Marc Rasmussen    schedule 07.12.2012    source источник
comment
Добавить куда AND Number_of_answered > 0?   -  person Kosta    schedule 07.12.2012
comment
если количество ваших ответов равно нулю, то процент ваших ответов равен нулю, что в этом плохого?   -  person Kirill Leontev    schedule 07.12.2012
comment
@beherenow На самом деле в моем заявлении есть ошибка, это должно быть Number_of_calls/Number_of_answered   -  person Marc Rasmussen    schedule 07.12.2012


Ответы (3)


Функцию nullif можно использовать для возврата нуля, если делитель равен нулю. Когда SQL встречает делитель нуля, он заставляет все уравнение возвращать значение null, предотвращая возникновение вашей ошибки.

select 
Number_of_Calls,
Number_of_Answered,
((Number_of_answered/nullif(Number_Of_Calls,0))*100) as answer_percent,
Date
from table Where Date BETWEEN '2012-09-10' AND '2012-09-11'

Если вы хотите исключить нулевые проценты, используйте следующий SQL:

select * from(select 
    Number_of_Calls,
    Number_of_Answered,
    ((Number_of_answered/nullif(Number_Of_Calls,0))*100) as answer_percent,
    Date
    from table Where Date BETWEEN '2012-09-10' AND '2012-09-11') alias
where answer_percent is not null;
person Kevin Bowersox    schedule 07.12.2012
comment
Когда я пишу это, я получаю S1000 (906) [Oracle] [ODBC] [Ora] ORA-00906: отсутствует левая скобка - person Marc Rasmussen; 07.12.2012
comment
Вы скопировали и вставили или расшифровали ответ? Расшифровать смысл напечатал? Я не вижу никаких проблем с синтаксисом и могу выполнить аналогичный оператор в своей базе данных. - person Kevin Bowersox; 07.12.2012
comment
Вот мое утверждение в моей базе данных: выберите ANTAL_KALD, BESVARET_25_SEK, ((ANTAL_KALD/nullif(BESVARET_25_SEK,0))*100) как answer_percent, TIDSPUNKT из таблицы, где TIDSPUNKT МЕЖДУ '2012-09-10' И '2012-09-11 ' - person Marc Rasmussen; 07.12.2012
comment
@MarcRasmussen Отлично! Молодец! - person Kevin Bowersox; 07.12.2012
comment
есть ли способ не включать Null ? например, если это значение null, то я не хочу получать эту строку? - person Marc Rasmussen; 07.12.2012

я думаю, вы имеете в виду, что «Number_Of_Calls» может быть нулевым (таким образом, возникает ошибка zero_divide?), если да, то сделайте

case Number_Of_Calls when 0 then 0 else ((Number_of_answered/Number_Of_Calls)*100) as answer_percent
person DazzaL    schedule 07.12.2012

Насколько я понял из вашего комментария, вам нужен процент отвеченных звонков за определенный период времени, включая дни, когда 100% звонков остались без ответа.

Я думаю, самый простой подход был бы

select sum(number_of_answered) / sum (number_of_calls) 
  from table 
 where date between interval_start and interval_end

в этом случае.

person Kirill Leontev    schedule 07.12.2012