Имя: Пароль:
1C
1С v8
Булева сумма или как отобрать одно значение по нескольким совпадающим полям?
0 BaZZiL
 
02.12.22
14:09
Приветствую уважаемое сообщество!

Есть таблица с колонками "Флаг" (булево) и "Ссылка", где для Ссылка1 все условия выполнены, а для Ссылка2 не все:

Флаг    |Ссылка
-----------
Истина    |Ссылка1
Истина    |Ссылка1
Ложь    |Ссылка2
Истина    |Ссылка2

Как отобрать запросом только те ссылки, у которых во всех строках значения Флага = Истина?

Т.е. результатом должно быть "Ссылка1"
1 Kassern
 
02.12.22
14:11
(0) Как вариант, отобрать все у которых стоит ложь, далее вычесть эту таблицу из общей. Будут только те ссылки которые имеют флаг истина
2 mikecool
 
02.12.22
14:12
левое соединение саму с собой с отбором по Флаг = Ложь
где справа есть нулл
3 Kassern
 
02.12.22
14:12
Если же вам просто нужно вывести все ссылки, у которых флаг Истина, то обычный отбор по этому полю
4 mikecool
 
02.12.22
14:12
(3) не канает
5 Kassern
 
02.12.22
14:13
(2) В общем, как я и написал в (1) )
6 Kassern
 
02.12.22
14:14
(4) Еще как канает, для условия "если.." в моем сообщении.
7 Aleksey
 
02.12.22
14:15
заменить булево на число (0,1) и далее если количество ссылок = итог флаг - значит все истина
8 Kassern
 
02.12.22
14:16
(7) Можно и не заменять, просто сгруппировать по ссылке и взять минимум по флагу. А дальше отбор флаг=Истина
9 mikecool
 
02.12.22
14:17
(7) тоже верно
имеющие Количество(Ссылка) = Сумма(Флаг)
10 lodger
 
02.12.22
14:18
(0) имеющие минимум(Флаг) = Истина
11 mikecool
 
02.12.22
14:18
жаль неявного преобразования Булево к Числу в запросе нет )
12 Волшебник
 
модератор
02.12.22
14:18
>> Булева сумма...

Булева алгебра вышла из чата
13 Garykom
 
гуру
02.12.22
14:22
(0)
ВЫБРАТЬ Флаг,
        Ссылка
ИЗ ТаблицаСКолонками
СГРУППИРОВАТЬ ПО
                Флаг,
                Ссылка

оставит сколько строк?
14 Aleksey
 
02.12.22
14:22
(11) есть выбор когда иначе
15 KJlag
 
02.12.22
14:24
(12) xor?
16 Garykom
 
гуру
02.12.22
14:26
(10) кстати да! или максимум
17 mikecool
 
02.12.22
14:27
(16) не, максимум неправильно
18 Смотрящий
 
02.12.22
14:27
Сгруппировать по флагу и ссылке
Проверить на Количество(Ссылка) = 1 и Флаг = Истина
19 hockeyist
 
02.12.22
14:29
(16) Какой такой "или максимум"? только минимум
20 hockeyist
 
02.12.22
14:30
(18) Неправильно
21 Garykom
 
гуру
02.12.22
14:31
(19) (17) имеющие минимум(Флаг) = Ложь же?
22 Garykom
 
гуру
02.12.22
14:31
(21) тьфу

*имеющие максимум(Флаг) = Ложь
23 formista2000
 
02.12.22
14:32
количество различные уже было?
24 hockeyist
 
02.12.22
14:32
(22) или максимум
25 hockeyist
 
02.12.22
14:32
(23) Нет еще пока
26 kittystark
 
02.12.22
14:33
запросы это хорошо, а если вдруг это еще и для отчета на СКД, то есть выражение ресурса ВСЕ(флаг)
27 Kassern
 
02.12.22
14:33
(22) вот смотрите
1 Истина
1 Ложь
2 Ложь
2 Ложь
3 Истина
3 Истина

В вашем случае вы выведите 2, а нужно 3
28 hockeyist
 
02.12.22
14:37
(27) Он хотел сказать: "НЕ имеющие максимум(флаг)=ложь"
29 ass1c
 
02.12.22
14:42
(1) +

    КвалификаторыСтроки = Новый КвалификаторыСтроки(20);
    ОписаниеСтроки = Новый ОписаниеТипов("Строка", ,КвалификаторыСтроки);

    ТЗ = Новый ТаблицаЗначений;
    ТЗ.Колонки.Добавить("Флаг"   , Новый ОписаниеТипов("Булево"));
    ТЗ.Колонки.Добавить("Ссылка" , ОписаниеСтроки);
    
    НС = ТЗ.Добавить();
    Нс.Флаг   = Истина;
    Нс.Ссылка = "Ссылка1";
    
    НС = ТЗ.Добавить();
    Нс.Флаг   = Истина;
    Нс.Ссылка = "Ссылка1";

    НС = ТЗ.Добавить();
    Нс.Флаг   = Ложь;
    Нс.Ссылка = "Ссылка2";

    НС = ТЗ.Добавить();
    Нс.Флаг   = Истина;
    Нс.Ссылка = "Ссылка2";
    
    НС = ТЗ.Добавить();
    Нс.Флаг   = Истина;
    Нс.Ссылка = "Ссылка3";
    
    НС = ТЗ.Добавить();
    Нс.Флаг   = Истина;
    Нс.Ссылка = "Ссылка3";

    НС = ТЗ.Добавить();
    Нс.Флаг   = Ложь;
    Нс.Ссылка = "Ссылка4";
    
    НС = ТЗ.Добавить();
    Нс.Флаг   = Истина;
    Нс.Ссылка = "Ссылка4";
    
    НС = ТЗ.Добавить();
    Нс.Флаг   = Ложь;
    Нс.Ссылка = "Ссылка5";
    
    НС = ТЗ.Добавить();
    Нс.Флаг   = Ложь;
    Нс.Ссылка = "Ссылка5";
    
    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("ТЗ", ТЗ);
    // Теперь ТЗ можно использовать в запросе:
    Запрос.Текст = "ВЫБРАТЬ
                   |    ТЗ.Флаг КАК Флаг,
                   |    ТЗ.Ссылка КАК Ссылка
                   |ПОМЕСТИТЬ врТЗ
                   |ИЗ
                   |    &ТЗ КАК ТЗ
                   |;
                   |
                   |////////////////////////////////////////////////////////////////////////////////
                   |ВЫБРАТЬ
                   |    врТЗ.Ссылка КАК Ссылка
                   |ПОМЕСТИТЬ врНеВерные
                   |ИЗ
                   |    врТЗ КАК врТЗ
                   |ГДЕ
                   |    НЕ врТЗ.Флаг
                   |;
                   |
                   |////////////////////////////////////////////////////////////////////////////////
                   |ВЫБРАТЬ Различные
                   |    врТЗ.Ссылка КАК Ссылка
                   |ИЗ
                   |    врТЗ КАК врТЗ
                   |        ЛЕВОЕ СОЕДИНЕНИЕ врНеВерные КАК врНеВерные
                   |        ПО врТЗ.Ссылка = врНеВерные.Ссылка
                   |ГДЕ
                   |    врНеВерные.Ссылка ЕСТЬ NULL";
    
    
    Результат = Запрос.Выполнить().Выгрузить();
//Результат: Ссылка1, Ссылка3
30 KJlag
 
02.12.22
14:49
(23) а мне нравится твой вариант.

ВЫБРАТЬ
    Т.Ссылка КАК Ссылка,
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Т.Флаг) КАК Кол,
    МАКСИМУМ(Т.Флаг) КАК Макс
Поместить ВТ
ИЗ
    Таблица КАК Т

СГРУППИРОВАТЬ ПО
    Т.Ссылка


а дальше то где где кол = 1 и макс = истина
31 lodger
 
02.12.22
14:56
пятнично.
32 BaZZiL
 
02.12.22
15:06
(29) Ура, заработало!

Всех благодарю за ответы, пятниццо продолжется))!
Программист всегда исправляет последнюю ошибку.