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

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) приложил свой вариант решения, самое простое и оптимальное
Оставьте свое сообщение

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