Имя: Пароль:
1C
1С v8
Группировка в запросе с пустой таблицей
0 Hans
 
14.07.21
12:45
Стаж 10 лет. Я думал в результате в таблице не будет ничего. А оказалось будет NULL. А где про это написано?

ВЫБРАТЬ
    "А" КАК Поле,
    100 КАК Значение
ПОМЕСТИТЬ ВременнаяТаблица

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "Б",
    200

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "В",
    300
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВременнаяТаблица.Поле КАК Поле,
    ВременнаяТаблица.Значение КАК Значение
ПОМЕСТИТЬ ВременнаяТаблицаСОтбором
ИЗ
    ВременнаяТаблица КАК ВременнаяТаблица
ГДЕ
    ВременнаяТаблица.Поле = "Я"
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    СУММА(ВременнаяТаблицаСОтбором.Значение) КАК Значение
ИЗ
    ВременнаяТаблицаСОтбором КАК ВременнаяТаблицаСОтбором
1 ДенисЧ
 
14.07.21
12:47
Если ты ставишь СУММА() - то разумеется, NULL будет
Написано в любом учебнике по SQL
2 Мультук
 
гуру
14.07.21
13:02
(0) Ничего будет в случае

ВЫБРАТЬ
    СУММА(ВременнаяТаблицаСОтбором.Значение) КАК Значение,
    ВременнаяТаблицаСОтбором.Поле КАК Поле
ИЗ
    ВременнаяТаблицаСОтбором КАК ВременнаяТаблицаСОтбором

СГРУППИРОВАТЬ ПО
    ВременнаяТаблицаСОтбором.Поле
3 youalex
 
14.07.21
13:09
или  добавить
ИМЕЮЩИЕ Количество(*) > 0
4 Hans
 
14.07.21
13:13
(2) Я уж думал что я полностью заблуждался. Не знал такой ньюанс что без группировочных полей будет такой резльтат.
5 Hans
 
14.07.21
13:16
Где тож было правило  - Группировка уменьшает количество записей в таблице, Итоги увеличивают количество записей в таблице. В 1С книжке какой то.
6 dubolom
 
14.07.21
13:16
(4) Всё ведь логично.
В (0) группировка общая - по всему множеству (которое всегда одно).
В (2) - по значению поля (если полей с этим значением 0 или вообще 0, то и будет 0 строк).
7 Hans
 
14.07.21
13:18
Может у Митичкина в книге было. Надо перечитать, и если что предъявить.
8 Said_We
 
14.07.21
13:39
(5, 7) В общем случае так и есть.
В твоем случае пустое множество, у него другие законы. Операции сложения с пустым множеством, умножение, агрегатные функции в таких множествах и т.д. могут работать иначе чем НЕ с пустым.
Ты же обрабатываешь деление на НОЛЬ и вопрос не возникает и претензии не собираешься никому предъявлять? :-)
9 Said_We
 
14.07.21
13:54
Выбрать
     ВТ_Данные.Поле1
    ,ВТ_Пустая.Поле1
ИЗ
    ВТ_Данные как ВТ_Данные  
    <ВИД СОЕДИНЕНИЯ> ВТ_Пустая как ВТ_Пустая
    ПО ИСТИНА

Левое и полное соединение вернет столько строк сколько в ВТ_Данные
Правое и внутреннее вернет пустую таблицу

И декартово перемножение вернет тоже пустую таблицу. Хотя вроде как каждый с каждым. Но умножение на пустое множество есть пустое множество.

С агрегатными функциями примерно всё так же, т.е. есть свои нюансы.
10 Hans
 
14.07.21
14:25
Даже в запросах у меня куча пробелов.
11 Said_We
 
14.07.21
16:12
(10) У всех есть где-то пробелы :-) Только часто мы об этом незнаем и даже не догадываемся :-)
12 Kassern
 
14.07.21
16:38
(0) Давно знаком с подобным поведением запроса, вот простой пример:
ВЫБРАТЬ
    СУММА(БонусныеБаллы.Начислено) КАК Начислено
ИЗ
    РегистрНакопления.БонусныеБаллы КАК БонусныеБаллы
ГДЕ
    БонусныеБаллы.Партнер = ""

В данном случае отбор таблицу по идее должен без записей оставить, но из-за СУММА() выводится пустая строчка со значением null
13 Kassern
 
14.07.21
16:39
(12) но стоит только добавить какое то поле группировки, то результат запроса становится пустым)
14 Said_We
 
15.07.21
14:01
Такое поведение вы считаете не логичным или логичным?
15 Kassern
 
15.07.21
14:18
(14) мне такое поведение показалось странным, когда в первый раз столкнулся с этим. Ожидал что будет пустой результат.
16 1Сергей
 
15.07.21
14:23
(14) Почему бы и да?
17 Said_We
 
15.07.21
16:18
(15) Не знаю... Я не знаю как там правильно, но мне видится это так:

В первом случае без группировки агрегатная сумма применяется ко всему множеству, значение NULL, как и само множество. Т.е. саму функцию есть к чему применить, пусть к пустому, но множеству.
В случае с группировкой сумма применяется к группировкам. Сама по себе группировка подразумевает значение. Так как нет значений, то и нет группировок, следовательно и значений нет. Не к чему применять агрегатную функцию.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший