Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Работа ИМЕЮЩИЕ и Количество(*) > 1

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

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

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

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

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

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.