|
Вопрос по ЕСТЬNULL в запросе. | ☑ | ||||||
---|---|---|---|---|---|---|---|---|
0
Повелитель
13.02.13
✎
13:12
|
Вот задумался есть ли разница в запросе:
| ЕСТЬNULL(СУММА(Продажи.КоличествоОборот),0) КАК ПродажиКоличество или так: | СУММА(ЕСТЬNULL(Продажи.КоличествоОборот,0)) КАК ПродажиКоличество |
|||||||
1
Classic
13.02.13
✎
13:13
|
Есть
|
|||||||
2
Волшебник
13.02.13
✎
13:13
|
лучше второй вариант
|
|||||||
3
Восточный Парень
13.02.13
✎
13:14
|
(2) +1
|
|||||||
4
Maxus43
13.02.13
✎
13:14
|
2-й по феншую
|
|||||||
5
smitru
13.02.13
✎
13:14
|
Есть
Если в Продажи.КоличествоОборот будет NULL, то первое выдаст фигню, а второе будет работать корректно :-) |
|||||||
6
Повелитель
13.02.13
✎
13:14
|
Спасибо.
|
|||||||
7
Classic
13.02.13
✎
13:14
|
На наборе
1 2 NULL 3 Первый выдаст 6, второй 0 |
|||||||
8
Classic
13.02.13
✎
13:14
|
(7)Наоборот
|
|||||||
9
Повелитель
13.02.13
✎
13:15
|
Спасибо, все понятно.
|
|||||||
10
Как страшно жить
13.02.13
✎
13:15
|
(0) первый всегда выдаст число, второй может выдать NULL
(7) оба выдадут 6 |
|||||||
11
Как страшно жить
13.02.13
✎
13:16
|
(5) ложь это и провокация
|
|||||||
12
Как страшно жить
13.02.13
✎
13:16
|
(9) тебе врут, а ты веришь
|
|||||||
13
Humandra
13.02.13
✎
13:17
|
вот уже вторую тему с таким мнением читаю - что второй вариант лучше.
а по моему на агрегатных функциях суммирование как в 7 всегда выдаст нормальное количество а вот если будет вариант sum(null), то результат будет null и первый вариант выдал бы число |
|||||||
14
Humandra
13.02.13
✎
13:17
|
т.е. мое мнение - первый корректен, второй - ошибочен
|
|||||||
15
Maxus43
13.02.13
✎
13:18
|
работа их будет с точки зрения юзера - одинаковая, с точки зрения системы лучше 2-й вариант
|
|||||||
16
Как страшно жить
13.02.13
✎
13:18
|
(13) единственный вариант расхождения в результатах, это вариант пустой выборки
|
|||||||
17
Humandra
13.02.13
✎
13:18
|
(16) да, я и имею его в виду
|
|||||||
18
Maxus43
13.02.13
✎
13:18
|
>>а вот если будет вариант
sum(null), то результат будет null второй вариант исключает эту ситуацию, а первый наоборот позволяет |
|||||||
19
Как страшно жить
13.02.13
✎
13:18
|
(15) разница есть, но редко встречается
|
|||||||
20
Defender aka LINN
13.02.13
✎
13:19
|
(13) А второй, типа, дату вернет, да?
|
|||||||
21
Humandra
13.02.13
✎
13:19
|
(16) т.е. когда к, примеру, продаж не было вообще
первый вариант даст 0 второй - null (а как правило, это не то, что нужно) |
|||||||
22
Как страшно жить
13.02.13
✎
13:19
|
(2) там не всегда число может получиться, а в 1-м варианте всегда
|
|||||||
23
Maxus43
13.02.13
✎
13:19
|
(21) наоборот. второй даст 0
|
|||||||
24
Как страшно жить
13.02.13
✎
13:19
|
(20) нет, NULL
|
|||||||
25
Humandra
13.02.13
✎
13:20
|
(20) второй выдаст null
и при попытке оперирования этим null мы получим ошибку преобразования типов |
|||||||
26
Как страшно жить
13.02.13
✎
13:20
|
(23) брешишь
|
|||||||
27
Как страшно жить
13.02.13
✎
13:20
|
давайте голосовалку
|
|||||||
28
Повелитель
13.02.13
✎
13:20
|
Не думал я, что такой вопрос может мнения раздвоиться.
|
|||||||
29
Maxus43
13.02.13
✎
13:21
|
вы про пустую выборку щас? если она не пустая - 2й вариант даст число всегда. Приведите пример обратного
|
|||||||
30
Повелитель
13.02.13
✎
13:21
|
(27) Как это сделать?
|
|||||||
32
Shurjk
13.02.13
✎
13:22
|
(28) Ну дык лучше часами спорить чем просто проверить.
|
|||||||
33
Humandra
13.02.13
✎
13:22
|
(29) если выборка непустая, то вариант 1 и 2 эквавалентны полностью
зато если она пустая, то вариант 2 даст ошибку |
|||||||
34
smitru
13.02.13
✎
13:22
|
(30) Критерий истины - практика
Запускаешь 1С, делаешь ТабличнуюЧасть и смотришь сам в запросе... |
|||||||
35
Как страшно жить
13.02.13
✎
13:23
|
проверяю:
ВЫБРАТЬ ЕСТЬNULL(СУММА(1), 0) КАК Поле1, СУММА(ЕСТЬNULL(1, 0)) КАК Поле2 ИЗ Справочник.Номенклатура КАК Номенклатура ГДЕ ЛОЖЬ на непустых выборках результат ВСЕГДА равен |
|||||||
36
smitru
13.02.13
✎
13:24
|
Млин... курите сударь "агрегатные функции" SQL и что выдают они если среди элементов суммирования встречается именно NULL
Для этого и ввели ЕСТЬNULL() |
|||||||
37
Как страшно жить
13.02.13
✎
13:24
|
(36) она ихигнорирует просто, не знал?
|
|||||||
38
Shurjk
13.02.13
✎
13:25
|
(36) И что они выдадут?
|
|||||||
39
smitru
13.02.13
✎
13:25
|
(35) ё-ё-ё-ё.. ну всё понятно.. про группировки ещё видно не дочитал... Где в твоём запросе группировка??? :-)
|
|||||||
40
Повелитель
13.02.13
✎
13:25
|
Все я проверять полез. На форум и зашел чтобы без тестирования это узнать.
|
|||||||
41
Maxus43
13.02.13
✎
13:26
|
(40) правильно, миста лучший отладчик
|
|||||||
42
smitru
13.02.13
✎
13:27
|
(40) зря... тут быдлокодеров тьма тьмущая :-)
|
|||||||
43
Как страшно жить
13.02.13
✎
13:27
|
(39) она не обязательна вообще то
|
|||||||
44
Как страшно жить
13.02.13
✎
13:30
|
вообще 1С-ники переняли довольно неудачный вариант, по фэн-шую правильно COALESCE
|
|||||||
45
acsent
13.02.13
✎
13:32
|
разница будет на наборах без данных. Первый выдаст 0, второй NULL
|
|||||||
46
Повелитель
13.02.13
✎
13:32
|
Вот запрос накидал:
ВЫБРАТЬ спрНом.Ссылка, СУММА(ТоварыНаСкладахОстатки.КоличествоОстаток)+1 КАК КоличествоОстаток, ЕСТЬNULL(СУММА(ТоварыНаСкладахОстатки.КоличествоОстаток), 0)+1 КАК КоличествоОстаток1, СУММА(ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, 0))+1 КАК КоличествоОстаток2 ИЗ Справочник.Номенклатура КАК спрНом ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки ПО спрНом.Ссылка = ТоварыНаСкладахОстатки.Номенклатура ГДЕ спрНом.Ссылка В ИЕРАРХИИ(&Ссылка) СГРУППИРОВАТЬ ПО спрНом.Ссылка ИТОГИ СУММА(КоличествоОстаток), СУММА(КоличествоОстаток1), СУММА(КоличествоОстаток2) ПО ОБЩИЕ Сумма итогов: КоличествоОстаток 2 943, КоличествоОстаток1 3 123, КоличествоОстаток2 3 123 Разницы по 1 и второму варианту не вижу, без ЕСТЬNULL отрабатывает некорректно. |
|||||||
47
smitru
13.02.13
✎
13:33
|
Читаем букварь
Агрегатная функция СУММА Функция вычисляет арифметическую сумму всех попавших в выборку значений поля. В качестве параметра функции можно указывать только поля, содержащие числовое значение. Если поле не может содержать числовых значений, то применение функции СУММА к такому полю вызовет ошибку. Если поле может содержать числовые значения (имеет составной тип данных), то данная функция может быть применена к такому полю. Но если среди значений поля в выборке встретится нечисловое значение (помимо значений NULL), это вызовет ошибку. Много раз перечитываем последнее предложение и думаем, думаем, думаем |
|||||||
48
Как страшно жить
13.02.13
✎
13:34
|
(47) я уже давно правильный ответ тут написал и не раз
|
|||||||
49
acsent
13.02.13
✎
13:34
|
(46) Тебе 5 раз сказали где разница
|
|||||||
50
Повелитель
13.02.13
✎
13:34
|
(47) У меня только числовое и NULL, поэтому ошибки не вылетает.
|
|||||||
51
Humandra
13.02.13
✎
13:36
|
(47) здесь не написано, что если среди данных встретиться null, то агрегатная функция вернет ошибку или null
практика, что характерно, подтверждает мое мнение :) |
|||||||
52
Повелитель
13.02.13
✎
13:36
|
(48) (49) Это хорошо что у вас мнение по этому поводу железное. А как быть мне, если мнения на форуме разошлись?
Спрошу по другому. У меня запрос будет типа (46), какой вариант там выбрать лучше. |
|||||||
53
Как страшно жить
13.02.13
✎
13:37
|
(52) в твоем случае без разницы
|
|||||||
54
Повелитель
13.02.13
✎
13:38
|
(53) Спасибо :)
|
|||||||
55
smitru
13.02.13
✎
13:39
|
(47) 1 + 2 + 3 + 4 = 10
1 + 2 + null + 4 = null ЕСТЬNULL(1, 0) + ЕСТЬNULL(2,0) + ЕСТЬNULL(null,0) + ЕСТЬNULL(4, 0) = 7 Не видишь разницы? |
|||||||
56
Как страшно жить
13.02.13
✎
13:40
|
(55) а теперь с агрегатными функциями ))
|
|||||||
57
Повелитель
13.02.13
✎
13:42
|
(55) В моем случае будет так я понял:
ЕСТЬNULL(1, 0) + ЕСТЬNULL(2,0) + ЕСТЬNULL(null,0) + ЕСТЬNULL(4, 0) = 7 ЕСТЬNULL(1 + 2 + null + 4),0) = 7 |
|||||||
58
GANR
13.02.13
✎
13:43
|
Только так: СУММА(ЕСТЬNULL(Продажи.КоличествоОборот,0)).
|
|||||||
59
Humandra
13.02.13
✎
13:45
|
(57) да. но не 1 + 2 + null + 4
а СУММА(1, 2, null, 4) налл + число будет налл но для агрегатных функций это неверно, они суммируют, игнорируя наллы |
|||||||
60
Повелитель
13.02.13
✎
13:45
|
(59) Понял
|
|||||||
61
Humandra
13.02.13
✎
13:46
|
(58)
тогда попробуй на таком запросе выбрать СУММА(ЕСТЬNULL(Продажи.КоличествоОборот,0)) из таблицы где 1 <> 1 |
|||||||
62
acsent
13.02.13
✎
13:46
|
(52) в твоем случае сумма вообще не нужна, как и сгруппировать
|
|||||||
63
Повелитель
13.02.13
✎
13:47
|
(62) Это упрощенный запрос, у меня данные берутся из вложенного запроса, но суть та же.
|
|||||||
64
DexterMorgan
13.02.13
✎
13:48
|
(55) по-видимому тебе нужно перечитать (47) до просветления.
|
|||||||
65
Darklight
13.02.13
✎
13:48
|
В приведённом в (0) сабже первый вариант более корректен. Так как агрегат СУММА() при обработке NULL считает его как 0 и нормально суммирует. А вот, если исходный набор будет пустым - агрегат вернёт NULL (в одной единственной строке) - а если написать ЕСТЬNULL(Сумма(Продажи.КоличествоОборот),0) - то в этой строке будет 0.
|
|||||||
66
Humandra
13.02.13
✎
13:52
|
(65) почему-то уже во второй теме эта простая вещь очень долго до народа доходит :)
кстати, ИМХО, первый вариант чуть лучше еще и тем, что ЕСТЬNULL будет вызываться только один раз после суммирования. Правда, это экономия на спичках, но все же душу греет :) |
|||||||
67
Humandra
13.02.13
✎
13:55
|
проголосовала :)
1 Вариант |
|||||||
68
Повелитель
13.02.13
✎
13:55
|
Пусть голосовалка будет :)
Я бы сразу поверил Как страшно жить, если бы в этой теме не отписался Волшебник, а я на его учебнике учился можно сказать! |
|||||||
69
Как страшно жить
13.02.13
✎
13:56
|
Кстати да
1 Вариант |
|||||||
70
Darklight
13.02.13
✎
13:57
|
появилась голосовалака значит
1 Вариант |
|||||||
71
Darklight
13.02.13
✎
14:00
|
Обычно в голосовалках бывает не менее 3-х вариантов и обычно бывает вариант "Прочее" - где тут такое?
Вот, можно было бы и такой вариант предложить ЕСТЬNULL(СУММА(ЕСТЬNULL(Продажи.КоличествоОборот,0)),0) КАК ПродажиКоличество Это уж точно наверняка ;) |
|||||||
72
Повелитель
13.02.13
✎
14:01
|
(71) Уже не могу поменять.
|
|||||||
73
Darklight
13.02.13
✎
14:01
|
(66)Волшебник за второй вариант - он знает в этом толк ;)
|
|||||||
74
Humandra
13.02.13
✎
14:03
|
но вот такое:
ЕСТЬNULL(СУММА(Продажи.Количество1 + Продажи.Количество2),0) работать будет некорректно думаю, почему - очевидно |
|||||||
75
Darklight
13.02.13
✎
14:11
|
(74)В общем случае - да - может работать некорректно
А давайте новую тему и новый опрос откроем Что лучше СУММА(ЕСТЬNULL(Продажи.Количество1,0) + ЕСТЬNULL(Продажи.Количество2,0)) или ЕСТЬNULL(СУММА(Продажи.Количество1) + СУММА(Продажи.Количество2),0) Кстати, почему-то никто не поднял вопрос, кто такие эти "Продажи" и откуда там вообще могут взяться значения NULL Например, все таблицы регистра накопления не порождают сами по себе значения NULL - они могут возникнуть только в левых/правых/полных соединениях, с использованием данной таблицы. В этом случае в(72) поля Количество1 и Количество2 могут быть NULL только одновременно (и это отработает корректно), но если там "Продажи" - это произвольная таблица, скажем из под-запроса - то эти поля в общем случае могут иметь произвольные значения. |
|||||||
76
Humandra
13.02.13
✎
14:17
|
(75) тот же принцип, что и в (0)
лучше ЕСТЬNULL(СУММА(Продажи.Количество1) + СУММА(Продажи.Количество2),0) потому что агрегатная функция налл в результате дать не может а 0 + 0 - будет число. зато в первом варианте опять таки проблемы с пустым множеством :) |
|||||||
77
Повелитель
13.02.13
✎
14:17
|
(75)
Упрощенный запрос я привел в (46) |
|||||||
78
mr_K
13.02.13
✎
14:21
|
А чтобы тогда не обсудить разницу СУММА(поле1 + поле2) и СУММА(поле1) + СУММА(поле2)?
|
|||||||
79
Как страшно жить
13.02.13
✎
14:24
|
(78) баян
|
|||||||
80
Darklight
13.02.13
✎
14:37
|
(76)Кстати, по-моему может, т.к.
1. Когда выборка пустая - будет NULL 2. Когда выборка не пустая, но все значения в суммируемом поле есть NULL - то в результате тоже будет NULL Кажется так. (78)Ну мы тут обработку NULL обсуждали |
|||||||
81
Humandra
13.02.13
✎
14:41
|
(80) хм. возможно вы и правы :)
но тогда оба варианта неверны :) и надо тот самый "100% надежный" - обернуть ЕСТЬNULL обе части и еще и снаружи |
|||||||
82
mikecool
13.02.13
✎
14:45
|
насколько мне помнится результаты
sum(Isnull()) и Isnull(sum()) могут быть разными в разных субд |
|||||||
83
Повелитель
13.02.13
✎
14:48
|
(82) Вот нам в этой теме только этого и нехватало ))))))
|
|||||||
84
mikecool
13.02.13
✎
14:49
|
(83) а, тут уже стеб.. я думал еще по теме...
|
|||||||
85
Повелитель
13.02.13
✎
14:52
|
(84) Нет тут стеба.
Просто уже более менее пришли к выводу. А если эту рассматривать с учетом разных СУБД, то спор будет вечным. |
|||||||
86
Humandra
13.02.13
✎
14:53
|
(82) ну, в оракле и скуле вроде бы одинаково, насколько помню
по моему, такое поведение агрегатных функций - стандарт но за PostgreSQL и DB2 не скажу, конечно... |
|||||||
87
Humandra
13.02.13
✎
14:53
|
(86) стандарт - я имею в виду ANSI
|
|||||||
88
mikecool
13.02.13
✎
14:54
|
(86) не помню, могу наврать, но кажется оракуль ругался на нул в агрегате, но это кажется 8й был
для постгри - прямым не проверял, а из 1с - съедается нормально |
|||||||
89
mikecool
13.02.13
✎
14:55
|
(87) а оракуль разве на анси стандарте?
|
|||||||
90
Humandra
13.02.13
✎
14:56
|
(88) не, насчет оракла точно - 5 лет на нем программила именно на такой конструции как 1 из (0)
(89) ну, часть какую-то соблюдают :) |
|||||||
91
mikecool
13.02.13
✎
14:59
|
(90) а я его уже лет 8-9 не видел ))
|
|||||||
92
Humandra
13.02.13
✎
14:59
|
(89) 9i поддерживал 99-й стандарт
с небольшими отклонениями точнее даже - с расширениями, я бы сказала |
|||||||
93
Humandra
13.02.13
✎
15:00
|
(91) да я тоже уже давно с ним не работаю. Года 3 примерно.
|
|||||||
94
Darklight
13.02.13
✎
15:21
|
(81)Почему тогда оба не верны? - первый вариант в любом случае отработает корректно (для данного агрегата); а я не припомню ни одной БД, где агрегаты ругались на NULL в соурсных данных. Если только свои собственные агрегатные функции писать (но 1С это не умеет).
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |