Имя: Пароль:
1C
 
ЕСТЬNULL и СУММА
0 НафНаф
 
18.12.09
09:00
Есть ли разница между
ЕСТЬNULL(СУММА(Остаток),0)
и
СУММА(ЕСТЬNULL(Остаток,0))

если нет, то что лучше использовать?
1 ZanderZ
 
18.12.09
09:01
сумма по null что даст ?!
2 Ksandr
 
18.12.09
09:02
Есть и лучше
СУММА(ЕСТЬNULL(Остаток,0))
3 НафНаф
 
18.12.09
09:04
(2) в чем разница?
4 SoftIce
 
18.12.09
09:08
а СУММА(Остаток) не выдаст ошибку, если Остаток - NULL
5 SoftIce
 
18.12.09
09:08
?
6 eklmn
 
гуру
18.12.09
09:12
ЕСТЬNULL(СУММА(Остаток),0) это не сработает ибо вывалиться на сумме если оно будет null
7 НафНаф
 
18.12.09
09:13
(6) у меня ошибки нет и разницы нет
8 eklmn
 
гуру
18.12.09
09:14
(7) ну и что из этого следует?
9 eklmn
 
гуру
18.12.09
09:15
сделай соединение с чем нибудь, чтобы Остаток был = null тогда посмотрим
10 НафНаф
 
18.12.09
09:15
(8) что на частном случае разницы нет
11 НафНаф
 
18.12.09
09:15
(9) там и так соединение, иначе откуда бы NULL появился?
12 eklmn
 
гуру
18.12.09
09:15
(10) это значит ты не догнал
13 Ksandr
 
18.12.09
09:15
null + 100 + 200 + 300 = null
ЕСТЬNULL(null, 0) + 100 + 200 + 300 = 600
14 eklmn
 
гуру
18.12.09
09:15
(11) а я откуда знаю появился он или нет
15 НафНаф
 
18.12.09
09:18
(13) это в обычном сложении, а в СУММА по другому
еще они мои ветки закрывают, фотка им не нравится, умники ((
16 Ksandr
 
18.12.09
09:24
(15) Не нашел подтверждения или опровержения твоим словам.
При сложении и при объединении с null резуьтат null, а чем СУММА особенна не знаю
17 НафНаф
 
18.12.09
09:27
(16) вот

ВЫБРАТЬ СУММА(Остаток) ИЗ
(ВЫБРАТЬ NULL КАК Остаток
ОБЪЕДИНИТЬ
ВЫБРАТЬ 10) КАК Т
18 eklmn
 
гуру
18.12.09
09:27
БУГАГАГА
19 НафНаф
 
18.12.09
09:37
(18) что ты хотел этим сказать?
20 Rusel
 
18.12.09
09:39
ВЫБРАТЬ СУММА(Остаток) ИЗ
(ВЫБРАТЬ NULL КАК Остаток
ОБЪЕДИНИТЬ
ВЫБРАТЬ NULL) КАК Т

Возвращает NULL

ВЫБРАТЬ СУММА(ЕСТЬNULL(Остаток, 0)) ИЗ
(ВЫБРАТЬ NULL КАК Остаток
ОБЪЕДИНИТЬ
ВЫБРАТЬ NULL) КАК Т

Возвращает 0
21 SoftIce
 
18.12.09
09:40
Для СУММА можно вообще на NULL не проверять, разве что только конечный результат (если все NULL, то и СУММА NULL будет)
Так что лучше ЕСТЬNULL(СУММА(Остаток),0)
22 SoftIce
 
18.12.09
09:42
Запрос
ВЫБРАТЬ
   Т1.Текст1,
   СУММА(Т1.Остаток)
ИЗ
   (
   ВЫБРАТЬ
       "Товар1" КАК Текст1,
       10 КАК Остаток
       
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       "Товар1",
       NULL
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       "Товар2",
       30
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       "Товар2",
       NULL
   ) КАК Т1
СГРУППИРОВАТЬ ПО
   ТЕКСТ1

выдает таблицу из 2-х строк
Товар1  10
Товар2  30
23 НафНаф
 
18.12.09
09:46
(20)(21)(22) СПАСИБО!!!!!
наконец то мне ответили
24 k23
 
18.12.09
10:24
есть принципиальная разница между вариантами
первый - гарантированно вернёт 1 строку
второй может и пустым оказаться.
25 hhhh
 
18.12.09
11:04
(8) СУММА() на NULL не вывалится
26 НафНаф
 
18.12.09
11:12
(24) а пример можно?
27 k23
 
18.12.09
12:11
(26) что-то типа вот такого:
ВЫБРАТЬ
   Продажи1.Период,
   Продажи1.Сумма,
   Продажи2.Сумма
ИЗ РегистрНакопления.Продажи КАК Продажи1
ЛЕВОЕ СОЕДИНЕНИЕ
   (ВЫБРАТЬ
       ЕСТЬNULL(СУММА(Сумма),0) КАК Сумма
       //СУММА(ЕСТЬNULL(Сумма,0)) КАК Сумма
   ИЗ РегистрНакопления.Продажи
   ГДЕ Период < 0
   ) КАК Продажи2
ПО ИСТИНА
ГДЕ Продажи2.Сумма = 0
28 denis_jj
 
22.12.09
22:47
Разница существенная и приводит к ошибкам, которые тяжело отлавливаются.

ЕСТЬNULL(СУММА(Остаток),0)

в случае если в остатке встречается NULL ошибки при выполнениии запроса не возникает, но суммирует все значения до первого встречающегося NULL, остальные отбрасывает. т.е. Сумма(10,10,NULL,10) будет равна 20! (не 30!!!).

Поэтому всегда нужно использовать СУММА(ЕСТЬNULL(Остаток,0))
29 Киборг
 
22.12.09
23:38
(28) это не так

Сумма(10,10,NULL,10)=30
Сумма(NULL,NULL,NULL,NULL)=NULL
30 denis_jj
 
26.12.09
12:29
(29) Вы правы. Я ошибся.

По своему опыту могу сказать, что всегда стараюсь использовать ЕСТЬNULL() до применения агрегатных функций, т.к. в сложных вложенных в несколько уровней запросах после отработки группировок на нескольких уровнях результаты вычислений могут менятся в зависимости от замены NULL. Отлаживать такие ошибки достаточно сложно - приходится разбирать запросы по уровням.