Имя: Пароль:
1C
1С v8
Работа ИМЕЮЩИЕ и Количество(*) > 1
,
0 Терпение и труд
 
02.01.21
02:46
Доброй ночи.
Пытаюсь разобраться с тем, как работает ИМЕЮЩИЕ.
Есть тестовый пример, табличная часть документа, которая содержит ФизЛицо (справочник), ПричинуИзмененияФамилии (справочник) и Фамилию (строка)
В ТЧ 6 записей:
Семенова Ольга Собственное желание Семенова
Петрова Марина Брак Петрова
Иванова Екатерина Брак Иванова
Петрова Марина Развод Сидорова
Петрова Марина Развод Сидорова
Семенова Ольга Развод Игнатенко

Далее к этой ТЧ применяется запрос:

    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
                   |    ДанныеСотрудниковДанные.ФизЛицо КАК ФизЛицо,
                   |    ДанныеСотрудниковДанные.ПричинаИзменения КАК ПричинаИзменения,
                   |    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ДанныеСотрудниковДанные.Фамилия) КАК Фамилия
                   |ИЗ
                   |    Документ.ДанныеСотрудников.Данные КАК ДанныеСотрудниковДанные
                   |ГДЕ
                   |    ДанныеСотрудниковДанные.Ссылка = &Ссылка
                   |
                   |СГРУППИРОВАТЬ ПО
                   |    ДанныеСотрудниковДанные.ФизЛицо,
                   |    ДанныеСотрудниковДанные.ПричинаИзменения
                   |
                   |ИМЕЮЩИЕ
                   |    КОЛИЧЕСТВО(*) > 1";
    Запрос.УстановитьПараметр("Ссылка", Ссылка);
    Выборка = Запрос.Выполнить().Выгрузить();

Запрос выдаёт 1 Развод Петрова Марина
Собственно, вопрос. Насколько я понял теорию, ИМЕЮЩИЕ применяет условие к уже сгруппированной таблице, а в данном случае, если убрать ИМЕЮЩИЕ, по отладчику
таблица содержит 5 строк, везде количество 1 (потому что 2 строки идентичные, они "схлопнулись"), насколько я понял, КОЛИЧЕСТВО(*) ищет одинаковые полностью результаты выборки, то есть, в данном случае, поскольку в группировке все строки встречаются ровно по 1 разу, то результат должен быть пустой. Но в таблицу попала Петрова.
Получается, что ИМЕЮЩИЕ плевать на группировку в данном случае?
1 СвинТуз
 
02.01.21
04:58
Звезда в шоке.
Вопрос в чем? По твоей группировке и твоим данным у тебе две одинаковые строки по Петровой.
Вот она и осталась.
2 Chameleon1980
 
02.01.21
07:19
сделай имеющие количество различные фамилия
а ты про номера строк забыл при звёздочек?
3 Chameleon1980
 
02.01.21
07:21
сделай выбрать * из данныеСотркдниеов
4 Ненавижу 1С
 
гуру
02.01.21
07:23
А как же твои данные:
Петрова Марина Развод Сидорова
Петрова Марина Развод Сидорова

КОЛИЧЕСТВО(*) это счётчик строк без условия полей на NULL
5 Терпение и труд
 
02.01.21
10:54
(2) А номера строк обязательно выбирать?
6 Терпение и труд
 
02.01.21
10:55
(4) Строк именно до группировки, исходных?
7 Ненавижу 1С
 
гуру
02.01.21
11:02
8 Ненавижу 1С
 
гуру
02.01.21
11:07
(2) причем тут номера строк? они что есть, что их нет в этом запросе
9 2mugik
 
02.01.21
11:15
вроде вначале срабатывает "где". Потом остальное.
10 Терпение и труд
 
02.01.21
11:21
(7) Ага, вот теперь легче. То есть, ещё раз для тупых, КОЛИЧЕСТВО(*) определяет, сколько строк вошли в каждую группировку?
11 Ненавижу 1С
 
гуру
02.01.21
11:34
(10) да, именно так
12 youalex
 
02.01.21
11:41
(9) если правильно помню, порядок такой: "ИЗ", "ГДЕ", "ВЫБРАТЬ", "СГРУППИРОВАТЬ", "ИМЕЮЩИЕ", "УПОРЯДОЧИТЬ"
13 Терпение и труд
 
02.01.21
11:42
(11) Большое вам спасибо! Разобрался, теперь всё понятно.
14 2mugik
 
02.01.21
12:03
(12)неправильно выразился - имеющие количество()>1 относится не к "итоговой" таблице, а к группировкам т.е. Количество различные в выбрать и количество в имеющие никак не связаны.
15 youalex
 
02.01.21
12:08
(12) + наврал, ВЫБРАТЬ - предпоследний, перед УПОРЯДОЧИТЬ (это вообще отдельно)
(14) ИМЕЮЩИЕ - это, условно,  "ГДЕ"  для агрегатных функций (итоговых, как ты пишешь) .
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс