|
Деление на ноль в запросе. | ☑ | ||
---|---|---|---|---|
0
dimaxx
09.08.17
✎
11:48
|
Ребята выручайте)) есть такой кусок кода. Вызывает деление на ноль. Что не так делаю?
ВЫБОР КОГДА ВложенныйЗапрос.ДнейПросрочкиВсего = 0 ТОГДА 0 ИНАЧЕ ВЫБОР КОГДА ВложенныйЗапрос.СуммаВзаиморасчетовОстаток = 0 ТОГДА 0 ИНАЧЕ ВЫБОР КОГДА ВложенныйЗапрос2.СуммаВзаиморасчетовОстаток = 0 ТОГДА 0 ИНАЧЕ ВЫБОР КОГДА ВложенныйЗапрос1.СуммаВзаиморасчетовОстаток = 0 ТОГДА 0 ИНАЧЕ ВЫБОР КОГДА ВложенныйЗапрос.ДнейПросрочкиВсего = 0 ТОГДА 0 ИНАЧЕ ВложенныйЗапрос.ДнейПросрочкиВсего / (ВложенныйЗапрос.СуммаВзаиморасчетовОстаток / ВложенныйЗапрос2.СуммаВзаиморасчетовОстаток) / (ВложенныйЗапрос.СуммаВзаиморасчетовОстаток / ВложенныйЗапрос1.СуммаВзаиморасчетовОстаток) КОНЕЦ КОНЕЦ КОНЕЦ КОНЕЦ КОНЕЦ КАК ПрКонтрактная |
|||
1
mistеr
09.08.17
✎
11:52
|
(0) Напиши один ВЫБОР через ИЛИ, без вложенности. Хоть понятней будет...
|
|||
2
ajax_new
09.08.17
✎
11:52
|
А почему не
Если ВложенныйЗапрос1.СуммаВзаиморасчетовОстаток = 0 или ВложенныйЗапрос.СуммаВзаиморасчетовОстаток = 0.... тогда 0 Иначе //Твое выражение Конец |
|||
3
dimaxx
09.08.17
✎
11:54
|
(1) (2) Так было изначально, это уже вариация. Не помогло
|
|||
4
Lexey_
09.08.17
✎
11:55
|
(0) "Что не так делаю?"
Делишь на ноль, написано же |
|||
5
Timon1405
09.08.17
✎
11:57
|
(0)последовательно поместите каждое выражение которое стоит в знаменателе в отдельное поле выборки
ВложенныйЗапрос2.СуммаВзаиморасчетовОстаток, потом (ВложенныйЗапрос.СуммаВзаиморасчетовОстаток / ВложенныйЗапрос1.СуммаВзаиморасчетовОстаток) итд найдете где именно 0 |
|||
6
dezss
09.08.17
✎
11:58
|
А ты уверен что косяк именно в этом куске запроса, а не в каком-то другом?
|
|||
7
dezss
09.08.17
✎
12:28
|
(0) Да и вообще, у тебя чета не так с формулой...все вроде приводится к вот такой
ВложенныйЗапрос.ДнейПросрочкиВсего/ВложенныйЗапрос1.СуммаВзаиморасчетовОстаток/ВложенныйЗапрос2.СуммаВзаиморасчетовОстаток |
|||
8
dezss
09.08.17
✎
12:28
|
(7) а не...брешу...со скобками не досчитался...
|
|||
9
mistеr
09.08.17
✎
12:48
|
(6) +1
P.S. Недавно я с удивлением узнал, что SQL Server может иногда выражение в ВЫБРАТЬ вычислить раньше, чем отбор в ГДЕ. То есть запрос ВЫБРАТЬ А / Б ИЗ Таблица ГДЕ Б <> 0 таки поделит на ноль. Но здесь не тот случай (надеюсь :) |
|||
10
mehfk
09.08.17
✎
12:50
|
(0) Убери многоэтажные "выбор когда", хер поймешь что там у тебя происходит.
|
|||
11
igork1966
09.08.17
✎
12:51
|
(9) Чего-то слабо верится
|
|||
12
Михаил Козлов
09.08.17
✎
12:54
|
Получить результат без деления и просмотреть числитель и знаменатель. Может там NULL.
|
|||
13
trooba
09.08.17
✎
13:02
|
(12) +1 Неявное приведение ull к 0
|
|||
14
h-sp
09.08.17
✎
13:06
|
(13) если там NULL то и результат будет NULL
A / NULL = NULL |
|||
15
igork1966
09.08.17
✎
13:06
|
(11) + наверняка у тебя там не такой простой запрос был... и например, группировка а условие до группировки выполнялось
|
|||
16
zvial
09.08.17
✎
13:26
|
А че бы так не написать
ВЫБОР КОГДА ВложенныйЗапрос.СуммаВзаиморасчетовОстаток = 0 ИЛИ ВложенныйЗапрос2.СуммаВзаиморасчетовОстаток = 0 ИЛИ ВложенныйЗапрос1.СуммаВзаиморасчетовОстаток = 0 ТОГДА 0 ИНАЧЕ ВложенныйЗапрос.ДнейПросрочкиВсего / (ВложенныйЗапрос.СуммаВзаиморасчетовОстаток / ВложенныйЗапрос2.СуммаВзаиморасчетовОстаток) / (ВложенныйЗапрос.СуммаВзаиморасчетовОстаток / ВложенныйЗапрос1.СуммаВзаиморасчетовОстаток) КОНЕЦ КАК ПрКонтрактная |
|||
17
SSSSS_AAAAA
09.08.17
✎
13:32
|
(11) И тем не менее это именно так. Порядок вычисления выражений и условий выбирает сервер.
|
|||
18
rudnitskij
09.08.17
✎
13:51
|
А делить на (Б делить на Ц) делить на (Д делить на Е) =
(А умножить на Ц делить на Б) делить на (Д делить на Е) = (А умножить на Ц умножить на Е делить на Б) делить на Д = (А умножить на Ц умножить на Е) делить на (Б умножить на Д) ------------------------------------------------------- попробуйте в таком духе переписать ваше выражение с делениями. Чем меньше вы делите - тем меньше шансов поделить на ноль |
|||
19
PiterPrg
09.08.17
✎
13:54
|
Возможно в одной из операций делений результат получается маленький.
Например 0.0034 Результат приводится к типу операндов (например число 15.2). Получается 0. Упрости выражение. Я честно говоря, не совсем понимаю что за коэффициент ты вычисляешь. Дни делишь на отношение сумм, а потом еще раз на отношение сумм) |
|||
20
rudnitskij
09.08.17
✎
14:00
|
(18) в результате будет следующее:
ВложенныйЗапрос.ДнейПросрочкиВсего * ВложенныйЗапрос2.СуммаВзаиморасчетовОстаток * ВложенныйЗапрос1.СуммаВзаиморасчетовОстаток / (ВложенныйЗапрос.СуммаВзаиморасчетовОстаток * ВложенныйЗапрос.СуммаВзаиморасчетовОстаток) |
|||
21
rudnitskij
09.08.17
✎
14:00
|
(20) и проверять на ноль нужно лишь два значения
|
|||
22
rudnitskij
09.08.17
✎
14:07
|
(19) формула преобразования времени в деньги)))
|
|||
23
dezss
09.08.17
✎
14:08
|
(21) одно значение
|
|||
24
dezss
09.08.17
✎
14:08
|
можно знаменатель просто умножить на 2, а не брать одно и то же 2 раза
|
|||
25
rudnitskij
09.08.17
✎
14:41
|
(24) не умножить на два, а возвести в квадрат. Садитесь, два)
|
|||
26
dezss
09.08.17
✎
14:47
|
(25) блин...во я туплю))))
а вроде еще не пятница...это все жара виновата) |
|||
27
vde69
09.08.17
✎
14:49
|
ВЫБОР
КОГДА ВложенныйЗапрос1.СуммаВзаиморасчетовОстаток * ВложенныйЗапрос.СуммаВзаиморасчетовОстаток * ВложенныйЗапрос.СуммаВзаиморасчетовОстаток = 0 ТОГДА 0 ИНАЧЕ ВложенныйЗапрос.ДнейПросрочкиВсего * ВложенныйЗапрос2.СуммаВзаиморасчетовОстаток * ВложенныйЗапрос1.СуммаВзаиморасчетовОстаток / ВложенныйЗапрос.СуммаВзаиморасчетовОстаток / ВложенныйЗапрос.СуммаВзаиморасчетовОстаток КОНЕЦ КАК ПрКонтрактная |
|||
28
AsadRoman
09.08.17
✎
14:57
|
Материться здесь можно?
|
|||
29
AsadRoman
09.08.17
✎
14:59
|
ПИ*дец математики собрались:
у одних Х*Х = 2*Х, другие проверяют на ноль А*В*В. Вот как так? Вы программисты или где? |
|||
30
novichok79
09.08.17
✎
15:04
|
(29) мы 1серы...
(0) ВЫБОР КОГДА заменить на ИЛИ, да и вообще как можно меньше ВЫБОР КОГДА. Зачем вообще такой адъ понадобилось писать? |
|||
31
novichok79
09.08.17
✎
15:04
|
(27) элегантненько.
|
|||
32
lodger
09.08.17
✎
15:14
|
(0) как ты думаешь запрос, 1с и субд раскроют деление деления на деление деления на деление?
упрости формулу то. |
|||
33
igork1966
09.08.17
✎
15:37
|
(17) Ты прав.
https://technet.microsoft.com/ru-ru/library/ms188295(v=sql.105).aspx Операции фильтрации (включая соединения) не обязательно применяются до вычисления столбцов результатов. |
|||
34
dimaxx
09.08.17
✎
15:41
|
(33) Интересно, почитал.
|
|||
35
dimaxx
09.08.17
✎
15:43
|
(27) Интересное решение. В будущем применю)
|
|||
36
dimaxx
09.08.17
✎
15:43
|
(16) Писал, не проходит
|
|||
37
dimaxx
09.08.17
✎
15:44
|
Вообще опять всем спасибо) Переписал запрос немного уменьшил делений)))
|
|||
38
h-sp
09.08.17
✎
15:45
|
(27) если одно из них NULL, то не прокатит такой вариант
|
|||
39
vde69
09.08.17
✎
15:47
|
(38)
ВЫБОР КОГДА ЕстьNULL(ВложенныйЗапрос1.СуммаВзаиморасчетовОстаток * ВложенныйЗапрос.СуммаВзаиморасчетовОстаток * ВложенныйЗапрос.СуммаВзаиморасчетовОстаток,0) = 0 ТОГДА 0 ИНАЧЕ ВложенныйЗапрос.ДнейПросрочкиВсего * ВложенныйЗапрос2.СуммаВзаиморасчетовОстаток * ВложенныйЗапрос1.СуммаВзаиморасчетовОстаток / ВложенныйЗапрос.СуммаВзаиморасчетовОстаток / ВложенныйЗапрос.СуммаВзаиморасчетовОстаток КОНЕЦ КАК ПрКонтрактная |
|||
40
Я_в_каске
09.08.17
✎
16:53
|
(39) интересное решение
|
|||
41
mistеr
09.08.17
✎
17:02
|
(39) Если одно из них NULL, то и результат должен быть NULL. ИМХО.
|
|||
42
Бубр
09.08.17
✎
17:04
|
(9) если план запроса посмотреть можно ужаснуться)
|
|||
43
dezss
09.08.17
✎
17:10
|
(39) блин, ну писали же в (29)...зачем еще раз перемножать на одно и то же при проверке?)))
|
|||
44
rudnitskij
10.08.17
✎
11:01
|
В решении этой задачи помог бы школьный учебник математики) его бы хватило
(0) Решение из (20) вам не подходит почему? Мало делений? |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |