Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Divide by zero error encountered  [new]
RoVS
Member

Откуда: Череповец
Сообщений: 689
Сервер MSSQL 2005, пытаюсь выполнить запрос:
select * from(
select 
	mc1.conntype, 
	round(mc1.cost/mc1.duration_mins,0.1) cost_min, 
	mc1.phoneb_t
from mobilecalls mc1
where mc1.phonea_t = 'xxxxxxxxxx'
and mc1.duration_mins>0
and mc1.cost>0
and	mc1.dt>='20110101'
)t where cost_min>1

В ответ получаю ошибку деление на ноль...
Подскажите, в чем проблема?
5 июл 11, 09:21    [10922070]     Ответить | Цитировать Сообщить модератору
 Re: Divide by zero error encountered  [new]
КО,
Guest
RoVS
В ответ получаю ошибку деление на ноль...
Подскажите, в чем проблема?

видимо, вы делите на 0
5 июл 11, 09:25    [10922091]     Ответить | Цитировать Сообщить модератору
 Re: Divide by zero error encountered  [new]
RoVS
Member

Откуда: Череповец
Сообщений: 689
КО,,

А ничего что есть условие:
and mc1.duration_mins>0 and mc1.cost>0
???
5 июл 11, 09:29    [10922103]     Ответить | Цитировать Сообщить модератору
 Re: Divide by zero error encountered  [new]
AlexeyVD
Member

Откуда:
Сообщений: 473
А если убрать строчку с round() работает? Поробуйте без деления вывести отдельно mc1.cost и mc1.duration_mins
5 июл 11, 09:33    [10922124]     Ответить | Цитировать Сообщить модератору
 Re: Divide by zero error encountered  [new]
Евгений Кириченко
Member

Откуда:
Сообщений: 10
Порядок вычислений сервер определяет сам.
Выражения в SELECT вполне могут вычисляться до применения Where.
5 июл 11, 09:38    [10922168]     Ответить | Цитировать Сообщить модератору
 Re: Divide by zero error encountered  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
RoVS,

SELECT  *
FROM    ( SELECT    mc1.conntype,
                    ROUND(CASE WHEN mc1.duration_mins = 0 THEN NULL
                               ELSE mc1.cost / mc1.duration_mins
                          END, 0.1) cost_min,
                    mc1.phoneb_t
          FROM      mobilecalls mc1
          WHERE     mc1.phonea_t = 'xxxxxxxxxx'
                    AND mc1.duration_mins > 0
                    AND mc1.cost > 0
                    AND mc1.dt >= '20110101'
        ) t
WHERE   cost_min > 1
5 июл 11, 09:40    [10922190]     Ответить | Цитировать Сообщить модератору
 Re: Divide by zero error encountered  [new]
RoVS
Member

Откуда: Череповец
Сообщений: 689
AlexeyVD,

Вот так работает:
select 
	mc1.conntype, 
	round(mc1.cost/mc1.duration_mins,0.1) cost_min, 
	mc1.phoneb_t
from mobilecalls mc1
where mc1.phonea_t = 'xxxxxxxxxx'
and mc1.duration_mins>0
and mc1.cost>0
and	mc1.dt>='20110101'
5 июл 11, 09:41    [10922201]     Ответить | Цитировать Сообщить модератору
 Re: Divide by zero error encountered  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Короче:
round(mc1.cost/NULLIF(mc1.duration_mins,0),0.1)
5 июл 11, 09:43    [10922220]     Ответить | Цитировать Сообщить модератору
 Re: Divide by zero error encountered  [new]
RoVS
Member

Откуда: Череповец
Сообщений: 689
kDnZP,

Спасибо, так работает...
А можно заставить MSSQL сначала выполнить вложенный запрос, а затем уже внешний???
5 июл 11, 09:44    [10922233]     Ответить | Цитировать Сообщить модератору
 Re: Divide by zero error encountered  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
RoVS
AlexeyVD,

Вот так работает:
select 
	mc1.conntype, 
	round(mc1.cost/mc1.duration_mins,0.1) cost_min, 
	mc1.phoneb_t
from mobilecalls mc1
where mc1.phonea_t = 'xxxxxxxxxx'
and mc1.duration_mins>0
and mc1.cost>0
and	mc1.dt>='20110101'
Говорят же, сейчас работает, а завтра сервер выберет другой план и опять будет делить на 0.
5 июл 11, 09:45    [10922234]     Ответить | Цитировать Сообщить модератору
 Re: Divide by zero error encountered  [new]
RoVS
Member

Откуда: Череповец
Сообщений: 689
iap,

спасибо, так совсем замечательно...
5 июл 11, 09:48    [10922251]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить