|   |   | 
| 
 | Вопрос по ЕСТЬ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С это не умеет).     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |