#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)
)