Предотвращение ошибки деления на ноль в инструкции case

#sql

#sql

Вопрос:

Я получаю ошибку divide by zero в моем скрипте. Кто-нибудь может, пожалуйста, помочь.

Я пытаюсь разделить две записи, и в одной из них есть ноль. Я не хочу потерять строку, пожалуйста, посоветуйте.

 select DATEPART(Year,Request_date) as "Year",
       DATEPART(Month,Request_date) as "Month",
       COUNT([MONTH_OF_SUSPENSION]) as "Request" ,
       sum(case when [PAYMENT_<=24HRS] = 'Y' then 1 else 0 end) as "Paid in 24hrs",   
       COUNT([MONTH_OF_SUSPENSION])/sum(case when [PAYMENT_<=24HRS] = 'Y' then 1 else 0 end) as "Achieved"
FROM suspension_br
  where REQUEST_STATUS = 'OTHERS'
GROUP BY DATEPART(Year,Request_date),DATEPART(Month,Request_date)
  

Комментарии:

1. «Я не хочу потерять строку» — итак, какое значение вы хотите вернуть, если текущей альтернативой является деление на 0?

Ответ №1:

Вы можете ввести второй case для проверки результата sum :

 case
when sum(case when [PAYMENT_<=24HRS] = 'Y' then 1 else 0 end) > 0
then COUNT([MONTH_OF_SUSPENSION])/sum(case when [PAYMENT_<=24HRS] = 'Y' then 1 else 0 end)
else 0 /* a default value that makes sense to you */
end as "Achieved"
  

Комментарии:

1. @Nugeswale: Нужна дополнительная помощь? Если нет, то, поскольку вы новичок, пожалуйста, не забудьте отметить ответ на свой вопрос, установив галочку перед ответом, который вам понравился больше всего.

Ответ №2:

Глядя на ваш код, я мог бы предположить, что вы используете MSSQL и, следовательно, вы могли бы использовать, nullif который возвращает null , если два аргумента равны. Так, например, ваш код может выглядеть следующим образом :

 COUNT([MONTH_OF_SUSPENSION])/nullif(sum(case when [PAYMENT_<=24HRS] = 'Y' then 1 else 0 end),0) as "Achieved"
  

Что это делает, так это то, что если значение sum оператора равно 0 , то делитель превращается из нуля в null , и это приведет к тому, что все уравнение станет null .

Ответ №3:

используйте другую инструкцию case для проверки результата вашей суммы

 select DATEPART(Year,Request_date) as "Year",
       DATEPART(Month,Request_date) as "Month",
       COUNT([MONTH_OF_SUSPENSION]) as "Request" ,
       sum(case 
             when [PAYMENT_<=24HRS] = 'Y' then 1 
             else 0 
           end) as "Paid in 24hrs",   
       case 
         when sum(case 
                    when [PAYMENT_<=24HRS] = 'Y' then 1 
                    else 0 
                  end) = 0 then 'whatever you want in this case' 
         else COUNT([MONTH_OF_SUSPENSION])/sum(case 
                                                 when [PAYMENT_<=24HRS] = 'Y' then 1  
                                                 else 0 
                                               end) as "Achieved"
FROM suspension_br
  where REQUEST_STATUS = 'OTHERS'
GROUP BY DATEPART(Year,Request_date),DATEPART(Month,Request_date)
  

хотя это выглядит довольно неприятно, так что вы могли бы немного привести это в порядок с помощью подвыборки:

 select 
  year, 
  month, 
  request, 
  PaidIn24hrs, 
  case
    when PaidIn24hrs = 0 then 'whatever you want in this case'
    else request/PaidIn24hrs
  end as "Achieved"
from 
(
    select DATEPART(Year,Request_date) as "Year",
           DATEPART(Month,Request_date) as "Month",
           COUNT([MONTH_OF_SUSPENSION]) as "Request" ,
           sum(case 
                 when [PAYMENT_<=24HRS] = 'Y' then 1 
                 else 0 
               end) as "PaidIn24hrs"
    FROM suspension_br
      where REQUEST_STATUS = 'OTHERS'
    GROUP BY DATEPART(Year,Request_date),DATEPART(Month,Request_date)
)