Вывод результата запроса в зависимости от условий

1. FUXEARA 29.04.24 18:03 Сейчас в теме
Доброго всем.
Нужен совет в таком вопросе. Например делаем выборку к справочнику "Соглашения", в выборку могут попасть как типовые(поле реквизита - партнер пустое) соглашения, так и индивидуальные(т.е. привязанные к партнеру), отбор производится по реквизиту, вид операции в справочнике Соглашения. Также могут отобраться только типовые соглашения, в виду отсутствия у партнера заключенных индивидуальных.

Получаем 2 варианта результата:
1)
Соглашение типовое 1
Соглашение типовое 2 и т.д.
Соглашение индивидуальное 1
Соглашение индивидуальное 2 и т.д.
2)
Соглашение типовое 1
Соглашение типовое 2 и т.д.

Вопрос такой, как в самом запросе, с применением каких условий, вывести в результат, в случае если есть и индивидуальные и типовые(вар 1), только индивидуальные, а если индивидуальных нет, то типовые автоматом сами выведутся.
Это конечно можно все обыграть уже обрабатывая сам результат выборки, выгрузить в таблицу и искать строки по условию, но хочется уже самим запросом сделать эту проверку и отфильтровать лишнее и получить готовый результат.

Я пытался так. Сделал два вложенных запроса и в запросе с индивидуальными добавил поле ЭтоИндивидульный и приравнивал его к 1, а в вложенном к типовым 0 и это все по итогу поместил эти оба запроса во временную таблицу ВТ
И потом пытался анализировать итог временной таблицы в запросе, через конструкцию ВЫБОР, ТОГДА, КОГДА и если итог ЭтоИндивидульный > 0 , тогда условие ВТ.ЭтоИндивидуальный = 1 ИНАЧЕ ВТ.ЭтоИндивидуальный = 0. Но выдает ошибку на подсчете Итога.
По теме из базы знаний
Найденные решения
11. FUXEARA 09.05.24 11:14 Сейчас в теме
(8) вчера чуть ошибся по памяти). вложенные запросы это было в первоначальной версии, потом модифицировал через выбор и обошелся без внутренних запросов
        "ВЫБРАТЬ
        |        СпрСоглашенияСКлиентами.Ссылка КАК Соглашение,
        |        СпрСоглашенияСКлиентами.ВидЦен КАК ВидЦены,  
        |        СпрСоглашенияСКлиентами.Склад КАК Склад, 
        |        СпрСоглашенияСКлиентами.Валюта КАК Валюта,
        |       ВЫБОР
        |          КОГДА СпрСоглашенияСКлиентами.Партнер = ЗНАЧЕНИЕ(Справочник.Партнеры.ПустаяСсылка)
        |              ТОГДА 0
        |          ИНАЧЕ 1
        |        КОНЕЦ КАК ИндивидуальноеСоглашение
        |ПОМЕСТИТЬ ВТ_Соглашения
        |    ИЗ
        |        Справочник.СоглашенияСКлиентами КАК СпрСоглашенияСКлиентами
        |    ГДЕ
        |        СпрСоглашенияСКлиентами.Организация = &Организация 
        |       И НЕ СпрСоглашенияСКлиентами.Ссылка.ПометкаУдаления
        |        И ВЫБОР
        |            КОГДА СпрСоглашенияСКлиентами.ДатаНачалаДействия <> &ПустаяДата
        |                ТОГДА СпрСоглашенияСКлиентами.ДатаНачалаДействия <= &НачДата
        |            ИНАЧЕ СпрСоглашенияСКлиентами.ДатаНачалаДействия = &ПустаяДата
        |        КОНЕЦ
        |        И ВЫБОР
        |            КОГДА СпрСоглашенияСКлиентами.ДатаОкончанияДействия <> &ПустаяДата
        |                ТОГДА СпрСоглашенияСКлиентами.ДатаОкончанияДействия >= &КонДата
        |            ИНАЧЕ СпрСоглашенияСКлиентами.ДатаОкончанияДействия = &ПустаяДата
        |        КОНЕЦ
        |        И СпрСоглашенияСКлиентами.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыСоглашенийСКлиентами.Действует)
        |        И СпрСоглашенияСКлиентами.Партнер В (&МассивПартнеров) 
        |        И СпрСоглашенияСКлиентами.Контрагент В (&МассивКонтрагентов)
        |        И СпрСоглашенияСКлиентами.ХозяйственнаяОперация = ЗНАЧЕНИЕ(Перечисление.ХозяйственныеОперации.РеализацияРекламныхМатериалов)
        |;
        |////////////////////////////////////////////////////////////­////////////////////
        |ВЫБРАТЬ
        |    ВТ_Соглашения.Соглашение КАК Соглашение,
        |    ВТ_Соглашения.ВидЦены КАК ВидЦены,  
        |    ВТ_Соглашения.Валюта КАК Валюта,
        |    ВТ_Соглашения.Склад КАК Склад        
        |ИЗ
        |    ВТ_Соглашения КАК ВТ_Соглашения
        |ГДЕ 
        |    ВТ_Соглашения.ИндивидуальноеСоглашение В
        |    (ВЫБРАТЬ 
        |         МАКСИМУМ(ВТ_Соглашения.ИндивидуальноеСоглашение)
        |     ИЗ  ВТ_Соглашения КАК ВТ_Соглашения
        |     )    
        |"; 

Показать
Vitaly1C8; +1 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Said-We 29.04.24 18:42 Сейчас в теме
(1) Не можешь решить, потому как задачу необходимо короче и понятнее для самого себя сформулировать.
Рисуй что на входе и что на выходе. Пока нарисуешь решение само собой придет. :-)
3. FUXEARA 29.04.24 18:54 Сейчас в теме
(2) я написал потому , что испробовал то, что думал и не вышло. Единственное что напрашивается, это после выборки уже обрабатывать результат, а прямо в запросе сделать не получается и идеи не приходят
4. Said-We 29.04.24 20:35 Сейчас в теме
(3) Вообще не понятно какая задача стоит.
5. FUXEARA 29.04.24 21:42 Сейчас в теме
(4) все, решил проблему.
Возможные варианты выборки я приложил.
Нужно было реализовать запрос таким образом, что если есть в выборке индивидуальные соглашения, то вывести только их, а если нет, то вывести то что есть.
6. user1880116 30.04.24 08:18 Сейчас в теме
(5)
Возможные варианты выборки я приложил.
Куда?
7. FUXEARA 30.04.24 11:45 Сейчас в теме
(6)
Получаем 2 варианта результата:
1)
Соглашение типовое 1
Соглашение типовое 2 и т.д.
Соглашение индивидуальное 1
Соглашение индивидуальное 2 и т.д.
2)
Соглашение типовое 1
Соглашение типовое 2 и т.д.
8. user1010751 08.05.24 16:58 Сейчас в теме
(5) интересно как все-таки решили это запросом?
у меня получилось что-то вроде этого:
ВЫБРАТЬ РАЗЛИЧНЫЕ
    Партнеры.Ссылка КАК Партнер
ПОМЕСТИТЬ ВТ_Партнеры
ИЗ
    Справочник.Партнеры КАК Партнеры
ГДЕ
    Партнеры.Ссылка В(&СписокПартнеров)

ИНДЕКСИРОВАТЬ ПО
    Партнер
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
    ВТ_Партнеры.Партнер КАК Партнер,
    ИндивидуальныеСоглашения.Ссылка КАК Соглашение,
    НЕ ИндивидуальныеСоглашения.Типовое КАК ЭтоИндивидуальноеСоглашение
ПОМЕСТИТЬ ВТ_СоглашенияПартнеров
ИЗ
    ВТ_Партнеры КАК ВТ_Партнеры
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.СоглашенияСКлиентами КАК ИндивидуальныеСоглашения
        ПО (ВТ_Партнеры.Партнер = ИндивидуальныеСоглашения.Партнер)

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

ВЫБРАТЬ
    ВТ_Партнеры.Партнер,
    ТиповыеСоглашения.Ссылка,
    НЕ ТиповыеСоглашения.Типовое
ИЗ
    ВТ_Партнеры КАК ВТ_Партнеры
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.СоглашенияСКлиентами КАК ТиповыеСоглашения
        ПО (ТиповыеСоглашения.Типовое)

ИНДЕКСИРОВАТЬ ПО
    ЭтоИндивидуальноеСоглашение
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
    ВТ_СоглашенияПартнеров.Партнер КАК Партнер,
    МАКСИМУМ(ВТ_СоглашенияПартнеров.ЭтоИндивидуальноеСоглашение) КАК ЕстьИндивидуальноеСоглашение
ПОМЕСТИТЬ ВТ_Сгруппированные
ИЗ
    ВТ_СоглашенияПартнеров КАК ВТ_СоглашенияПартнеров

СГРУППИРОВАТЬ ПО
    ВТ_СоглашенияПартнеров.Партнер

ИНДЕКСИРОВАТЬ ПО
    ЕстьИндивидуальноеСоглашение
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
    ВТ_Сгруппированные.Партнер КАК Партнер,
    ВТ_СоглашенияПартнеров.Соглашение КАК Соглашение
ИЗ
    ВТ_СоглашенияПартнеров КАК ВТ_СоглашенияПартнеров
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Сгруппированные КАК ВТ_Сгруппированные
        ПО (ВТ_Сгруппированные.Партнер = ВТ_СоглашенияПартнеров.Партнер)
            И (ВТ_Сгруппированные.ЕстьИндивидуальноеСоглашение = ВТ_СоглашенияПартнеров.ЭтоИндивидуальноеСоглашение)
Показать
9. FUXEARA 08.05.24 17:58 Сейчас в теме
(8)у меня другая реализация и кода меньше, но тоже через максимум) завтра выложу запрос. Так по памяти, сделал два вложенных запроса, в индивидуальных приравнял 1, в общих к 0 и объединил, потом закинул в таблицузначений в самом запросе и выбрал только те, которые соответствуют максимуму, т.е. если это 1, то выйдут только индивидуальные, а если их нет, то 0 будет максимумом и выйдут все что есть
11. FUXEARA 09.05.24 11:14 Сейчас в теме
(8) вчера чуть ошибся по памяти). вложенные запросы это было в первоначальной версии, потом модифицировал через выбор и обошелся без внутренних запросов
        "ВЫБРАТЬ
        |        СпрСоглашенияСКлиентами.Ссылка КАК Соглашение,
        |        СпрСоглашенияСКлиентами.ВидЦен КАК ВидЦены,  
        |        СпрСоглашенияСКлиентами.Склад КАК Склад, 
        |        СпрСоглашенияСКлиентами.Валюта КАК Валюта,
        |       ВЫБОР
        |          КОГДА СпрСоглашенияСКлиентами.Партнер = ЗНАЧЕНИЕ(Справочник.Партнеры.ПустаяСсылка)
        |              ТОГДА 0
        |          ИНАЧЕ 1
        |        КОНЕЦ КАК ИндивидуальноеСоглашение
        |ПОМЕСТИТЬ ВТ_Соглашения
        |    ИЗ
        |        Справочник.СоглашенияСКлиентами КАК СпрСоглашенияСКлиентами
        |    ГДЕ
        |        СпрСоглашенияСКлиентами.Организация = &Организация 
        |       И НЕ СпрСоглашенияСКлиентами.Ссылка.ПометкаУдаления
        |        И ВЫБОР
        |            КОГДА СпрСоглашенияСКлиентами.ДатаНачалаДействия <> &ПустаяДата
        |                ТОГДА СпрСоглашенияСКлиентами.ДатаНачалаДействия <= &НачДата
        |            ИНАЧЕ СпрСоглашенияСКлиентами.ДатаНачалаДействия = &ПустаяДата
        |        КОНЕЦ
        |        И ВЫБОР
        |            КОГДА СпрСоглашенияСКлиентами.ДатаОкончанияДействия <> &ПустаяДата
        |                ТОГДА СпрСоглашенияСКлиентами.ДатаОкончанияДействия >= &КонДата
        |            ИНАЧЕ СпрСоглашенияСКлиентами.ДатаОкончанияДействия = &ПустаяДата
        |        КОНЕЦ
        |        И СпрСоглашенияСКлиентами.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыСоглашенийСКлиентами.Действует)
        |        И СпрСоглашенияСКлиентами.Партнер В (&МассивПартнеров) 
        |        И СпрСоглашенияСКлиентами.Контрагент В (&МассивКонтрагентов)
        |        И СпрСоглашенияСКлиентами.ХозяйственнаяОперация = ЗНАЧЕНИЕ(Перечисление.ХозяйственныеОперации.РеализацияРекламныхМатериалов)
        |;
        |////////////////////////////////////////////////////////////­////////////////////
        |ВЫБРАТЬ
        |    ВТ_Соглашения.Соглашение КАК Соглашение,
        |    ВТ_Соглашения.ВидЦены КАК ВидЦены,  
        |    ВТ_Соглашения.Валюта КАК Валюта,
        |    ВТ_Соглашения.Склад КАК Склад        
        |ИЗ
        |    ВТ_Соглашения КАК ВТ_Соглашения
        |ГДЕ 
        |    ВТ_Соглашения.ИндивидуальноеСоглашение В
        |    (ВЫБРАТЬ 
        |         МАКСИМУМ(ВТ_Соглашения.ИндивидуальноеСоглашение)
        |     ИЗ  ВТ_Соглашения КАК ВТ_Соглашения
        |     )    
        |"; 

Показать
Vitaly1C8; +1 Ответить
10. Vitaly1C8 09.05.24 11:14 Сейчас в теме
Выбрать только индивидуальные поместить во временную таблицу ИНД
Выбрать только типовые с условием ГДЕ поместить во временную таблицу ТИП
Объединить ИНД и ТИП отсортировать если надо

ГДЕ (ВЫБРАТЬ КОЛИЧЕСТВО(*) ИЗ ИНД) = 0 // Не проверял

Если условие не отрабатывает тогда перед вторым запросом
ВЫБРАТЬ КОЛИЧЕСТВО(*) КАК Кво ПОМЕСТИТЬ _ГДЕ ИЗ ИНД
Выбрать только типовые с условием ГДЕ поместить во временную таблицу ТИП
ЛЕВОЕ СОЕДИНЕНИЕ _ГДЕ ПО ИСТИНА
ГДЕ _ГДЕ.Кво = 0
12. FUXEARA 09.05.24 11:20 Сейчас в теме
(10) приложил свой вариант решения, самое простое и оптимальное
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот