Убрать дублирующую часть строки по условию в запросе.

1. Az18011993 22.12.23 11:43 Сейчас в теме
Добрый день, уважаемые форумчане!
Есть задача. У меня две табличные части из документов, которые я связываю с собой ЛЕВЫМ соединением по атрибутам Ссылка с Основанием (основание это ссылка на документ основание), Номенклатура, Серия.
Но так вышло что в документе серии у той же номенклатуры могут отличаться. Н-р,:
Таблица 1 Таблица 2
документ1 ном1 серия1 кол1 документ2 ном2 серия2 кол2
Ссылка Ном 1 3 Ссылка Ном 1 8
Ссылка Ном 2 5

И при такой связи я теряю данные по номенклатуре из таблицы 1, если связывать по серии, если же убрать эту связь, то все есть, но тогда дублируется строка из таблицы 2, а мне это не нужно, тогда уж склеивать ее с количеством 0.
Что получилось как то так:
ном1 серия1 кол1 кол2
Ном 1 3 8
Ном 2 5 0
Вот сам пример запроса:
"ВЫБРАТЬ
|	УведомлениеОВыдачеВОтделенияМДЛП.Ссылка КАК Уведомление,
|	УведомлениеОВыдачеВОтделенияМДЛП.Основание КАК Отпуск,
|	УведомлениеОВыдачеВОтделенияМДЛПТовары.Номенклатура КАК Номенклатура,
|	УведомлениеОВыдачеВОтделенияМДЛПТовары.Серия КАК Серия,
|	УведомлениеОВыдачеВОтделенияМДЛПТовары.Количество КАК Количество
|ПОМЕСТИТЬ ВТ_Уведомления
|ИЗ
|	Документ.УведомлениеОВыдачеВОтделенияМДЛП КАК УведомлениеОВыдачеВОтделенияМДЛП
|		ЛЕВОЕ СОЕДИНЕНИЕ Документ.УведомлениеОВыдачеВОтделенияМДЛП.Товары КАК УведомлениеОВыдачеВОтделенияМДЛПТовары
|		ПО УведомлениеОВыдачеВОтделенияМДЛП.Ссылка = УведомлениеОВыдачеВОтделенияМДЛПТовары.Ссылка
|ГДЕ
|	УведомлениеОВыдачеВОтделенияМДЛП.Основание ССЫЛКА Документ.ОтпускТоваровВОтделение
|	И УведомлениеОВыдачеВОтделенияМДЛП.Дата > &Дата
|;
|
|////////////////////////////////////////////////////////////­////////////////////
|ВЫБРАТЬ
|	ОтпускТоваровВОтделениеТовары.Ссылка КАК Ссылка,
|	ОтпускТоваровВОтделениеТовары.Номенклатура КАК Номенклатура,
|	ОтпускТоваровВОтделениеТовары.СерияНоменклатуры КАК СерияНоменклатуры,
|	ОтпускТоваровВОтделениеТовары.Количество КАК Количество
|ПОМЕСТИТЬ ВТ_Отпуска
|ИЗ
|	Документ.ОтпускТоваровВОтделение.Товары КАК ОтпускТоваровВОтделениеТовары
|;
|
|////////////////////////////////////////////////////////////­////////////////////
|ВЫБРАТЬ
|	ВТ_Отпуска.Ссылка КАК Ссылка,
|	ВТ_Отпуска.Номенклатура КАК Номенклатура,
|	ВТ_Отпуска.СерияНоменклатуры КАК СерияНоменклатуры,
|	ВТ_Отпуска.Количество КАК КоличествоОтпуска,
|	ВТ_Уведомления.Уведомление КАК Уведомление,
|	ВТ_Уведомления.Количество КАК КоличествоВУведомлении
|ИЗ
|	ВТ_Отпуска КАК ВТ_Отпуска
|		ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Уведомления КАК ВТ_Уведомления
|		ПО ВТ_Отпуска.Ссылка = ВТ_Уведомления.Отпуск
|			И ВТ_Отпуска.Номенклатура = ВТ_Уведомления.Номенклатура
|ГДЕ
|	ВТ_Уведомления.Отпуск.Проведен
|	И ВТ_Уведомления.Уведомление.Проведен
|	И ВТ_Отпуска.Ссылка = &Ссылка";
Показать

Не подскажите как можно решить задачку?(
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. starik-2005 3088 22.12.23 12:15 Сейчас в теме
Агрегатные функции помогут?
3. Az18011993 22.12.23 13:10 Сейчас в теме
(2)Здравствуйте, немного не понял как Вы хотите это сделать через агрегатные функции, пример можно? Серии мне нужны все) Может я что то не так понял.
18. Az18011993 18.01.24 11:42 Сейчас в теме
(2)Добрый день, смею конечно позволить тебе понаглеть, но мне все же интересно, как бы решилась моя задача через агрегатные функции, частично решил задачу через полное соединение, но не думаю что это очень оптимизировано.
4. stopa85 42 22.12.23 13:37 Сейчас в теме
А почему не добавить еще и соединение по сериям?

|ИЗ
|    ВТ_Отпуска КАК ВТ_Отпуска
|        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Уведомления КАК ВТ_Уведомления
|        ПО ВТ_Отпуска.Ссылка = ВТ_Уведомления.Отпуск
|            И ВТ_Отпуска.Номенклатура = ВТ_Уведомления.Номенклатура
|            И ВТ_Отпуска.СерияНоменклатуры= ВТ_Уведомления.Серия
6. Az18011993 22.12.23 15:41 Сейчас в теме
(4)при соединении по сериям у меня отрезается один кортеж(
5. Captain_Pan 22.12.23 15:40 Сейчас в теме
Полное соединение пробовали? Ну и проверочки на изнулл не забудьте.
7. Captain_Pan 22.12.23 16:40 Сейчас в теме
(5) Как-то так. Могут быть ошибки, в блокноте писал
"ВЫБРАТЬ
|    УведомлениеОВыдачеВОтделенияМДЛП.Ссылка КАК Уведомление,
|    УведомлениеОВыдачеВОтделенияМДЛП.Основание КАК Отпуск,
|    УведомлениеОВыдачеВОтделенияМДЛПТовары.Номенклатура КАК Номенклатура,
|    УведомлениеОВыдачеВОтделенияМДЛПТовары.Серия КАК Серия,
|    УведомлениеОВыдачеВОтделенияМДЛПТовары.Количество КАК Количество
|ПОМЕСТИТЬ ВТ_Уведомления
|ИЗ
|    Документ.УведомлениеОВыдачеВОтделенияМДЛП КАК УведомлениеОВыдачеВОтделенияМДЛП
|        ЛЕВОЕ СОЕДИНЕНИЕ Документ.УведомлениеОВыдачеВОтделенияМДЛП.Товары КАК УведомлениеОВыдачеВОтделенияМДЛПТовары
|        ПО УведомлениеОВыдачеВОтделенияМДЛП.Ссылка = УведомлениеОВыдачеВОтделенияМДЛПТовары.Ссылка
|ГДЕ
|    УведомлениеОВыдачеВОтделенияМДЛП.Основание = &Ссылка
|    И УведомлениеОВыдачеВОтделенияМДЛП.Дата > &Дата
|    И УведомлениеОВыдачеВОтделенияМДЛП.Проведен
|;
|
|////////////////////////////////////////////////////////////­­////////////////////
|ВЫБРАТЬ
|    ОтпускТоваровВОтделениеТовары.Ссылка КАК Ссылка,
|    ОтпускТоваровВОтделениеТовары.Номенклатура КАК Номенклатура,
|    ОтпускТоваровВОтделениеТовары.СерияНоменклатуры КАК СерияНоменклатуры,
|    ОтпускТоваровВОтделениеТовары.Количество КАК Количество
|ПОМЕСТИТЬ ВТ_Отпуска
|ИЗ
|    Документ.ОтпускТоваровВОтделение.Товары КАК ОтпускТоваровВОтделениеТовары
|ГДЕ
|    ОтпускТоваровВОтделениеТовары.Ссылка = &Ссылка
|    И ОтпускТоваровВОтделениеТовары.Проведен
|;
|
|////////////////////////////////////////////////////////////­­////////////////////
|ВЫБРАТЬ
|    ЕСТЬNULL(ВТ_Отпуска.Ссылка, ВТ_Уведомления.Отпуск) КАК Ссылка,
|    ЕСТЬNULL(ВТ_Отпуска.Номенклатура, ВТ_Уведомления.Номенклатура) КАК Номенклатура,
|    ЕСТЬNULL(ВТ_Отпуска.СерияНоменклатуры, ВТ_Уведомления.Серия) КАК СерияНоменклатуры,
|    ЕСТЬNULL(ВТ_Отпуска.Количество, 0) КАК КоличествоОтпуска,
|    ВТ_Уведомления.Уведомление КАК Уведомление,
|    ЕСТЬNULL(ВТ_Уведомления.Количество, 0) КАК КоличествоВУведомлении
|ИЗ
|    ВТ_Отпуска КАК ВТ_Отпуска
|        ПОЛНОЕ СОЕДИНЕНИЕ ВТ_Уведомления КАК ВТ_Уведомления
|        ПО ВТ_Отпуска.Ссылка = ВТ_Уведомления.Отпуск
|            И ВТ_Отпуска.Номенклатура = ВТ_Уведомления.Номенклатура
|            И ВТ_Отпуска.СерияНоменклатуры = ВТ_Уведомления.Серия";
Показать
17. Az18011993 18.01.24 11:40 Сейчас в теме
(7)Все вроде бы получилось, но вот возникла проблема, что дублируется количество, можно ли как-то это решить?
Прикрепленные файлы:
8. ActionBlog 22.12.23 16:44 Сейчас в теме
Надо для начала определить ключи связи двух таблиц, которые будут однозначно идентифицировать какие строки из правой таблицы надо присоединять к левой. В Вашем случае, как я понял, одной номенклатуры недостаточно, а номенклатура+серия избыточно. Если существующими колонками этого сделать нельзя (а я так понял, что нельзя), то нужно сделать отдельную колонку в каждой таблице, прям добавить в конфигураторе, например "ИдентификаторДляСвязи" и программно, например обработкой, пройтись по всем документам и заполнить эти идентификаторы. А в запросе уже соединять не по номенклатуре и серии, а по ИдентификаторуДляСвязи. И перед записью документа потом пропишите правила заполнения идентификаторов.
11. Az18011993 28.12.23 17:25 Сейчас в теме
(8)Увы, дорабатывать конфигурацию нежелательно.
15. ActionBlog 29.12.23 10:45 Сейчас в теме
(11)Вы увидели только часть, в которой я написал про доработку, а самого главного не увидели.
Надо для начала определить ключи связи двух таблиц, которые будут однозначно идентифицировать какие строки из правой таблицы надо присоединять к левой

Какие ключи будут однозначно идентифицировать какие строки из правой таблицы надо присоединять к левой?
9. Said-We 22.12.23 17:36 Сейчас в теме
(1) Тут не нужно соединение. Достаточно объединить в подзапросе две табличные части, далее сгруппировать по ссылке, номенклатуре и серии, количество сложить.
Я так понимаю именно об этом в {2} написано.
Задача стандартная.
10. Az18011993 28.12.23 17:23 Сейчас в теме
(9)Добрый день, а со временными таблицами такое не получится провернуть? Почему подзапрос?
12. Said-We 28.12.23 20:01 Сейчас в теме
(10) Тут не нужна временная таблица. Иначе Вы создадите промежуточную временную таблицу в памяти только для того, чтобы её свернуть и получить итоговый результат. У Вас память безграничная?
13. Az18011993 29.12.23 09:12 Сейчас в теме
(12)Вы мне предлагаете что то такое делать что ли, просто не пойму как добиться результата через вложенный запрос.
Запрос:
ВЫБРАТЬ
	ВложенныйЗапрос.Номенклатура КАК Номенклатура,
	ВложенныйЗапрос.СерияНоменклатуры КАК СерияНоменклатуры,
	ВложенныйЗапрос.Ссылка КАК Ссылка,
	ВложенныйЗапрос.Количество_Отпуск КАК Количество_Отпуск,
	ВложенныйЗапрос.Количество_Уведомление КАК Количество_Уведомление,
	ВложенныйЗапрос.Умедомление КАК Умедомление
ИЗ
	(ВЫБРАТЬ
		ОтпускТоваровВОтделениеТовары.Ссылка КАК Ссылка,
		ОтпускТоваровВОтделениеТовары.СерияНоменклатуры КАК СерияНоменклатуры,
		ОтпускТоваровВОтделениеТовары.Количество КАК Количество_Отпуск,
		ОтпускТоваровВОтделениеТовары.Номенклатура КАК Номенклатура,
		0 КАК Количество_Уведомление,
		УведомлениеОВыдачеВОтделенияМДЛП.Ссылка КАК Умедомление
	ИЗ
		Документ.ОтпускТоваровВОтделение.Товары КАК ОтпускТоваровВОтделениеТовары
			ЛЕВОЕ СОЕДИНЕНИЕ Документ.УведомлениеОВыдачеВОтделенияМДЛП КАК УведомлениеОВыдачеВОтделенияМДЛП
			ПО ОтпускТоваровВОтделениеТовары.Ссылка = УведомлениеОВыдачеВОтделенияМДЛП.Основание
	ГДЕ
		ОтпускТоваровВОтделениеТовары.СерияНоменклатуры.СерияПромаркированаДляЦелейМДЛП = ИСТИНА
		И ОтпускТоваровВОтделениеТовары.Ссылка.Проведен = ИСТИНА
	{ГДЕ
		(ОтпускТоваровВОтделениеТовары.Номенклатура = &Номенклатура) КАК Поле2}
	
	ОБЪЕДИНИТЬ ВСЕ
	
	ВЫБРАТЬ
		УведомлениеОВыдачеВОтделенияМДЛП.Основание,
		УведомлениеОВыдачеВОтделенияМДЛПТовары.Серия,
		0,
		УведомлениеОВыдачеВОтделенияМДЛПТовары.Номенклатура,
		УведомлениеОВыдачеВОтделенияМДЛПТовары.Количество,
		УведомлениеОВыдачеВОтделенияМДЛПТовары.Ссылка
	ИЗ
		Документ.УведомлениеОВыдачеВОтделенияМДЛП.Товары КАК УведомлениеОВыдачеВОтделенияМДЛПТовары
			ЛЕВОЕ СОЕДИНЕНИЕ Документ.УведомлениеОВыдачеВОтделенияМДЛП КАК УведомлениеОВыдачеВОтделенияМДЛП
			ПО УведомлениеОВыдачеВОтделенияМДЛПТовары.Ссылка = УведомлениеОВыдачеВОтделенияМДЛП.Ссылка) КАК ВложенныйЗапрос
Показать


Мне ведь нужно получить таблицу...Пример
Документ отпуск: Ном1, Серия 1, Количество 3, Ном1, Серия 2, Количество 2
Документ уведомление( отпуск это основание этого документа): Ном1, Серия 1, Количество 5
и нужно чтобы выходила таблица
Ссылка Отпуск, Ссылка Уведомление Номенклатура Серия КоличествоВОтпуск КоличествоВУведомлении
Ссылка Ссылка Ном1 1 3 5
Ссылка - Ном1 2 2 0
14. Az18011993 29.12.23 09:16 Сейчас в теме
(12) Вот такой результат мне нужно получить. Да я думал об объединении, хотел каждый результат ТЧ загнать во временную и объединить.
Прикрепленные файлы:
16. Said-We 29.12.23 15:52 Сейчас в теме
(13) Вы в {1} формулировали вот такое задание. Определитесь какой документ Вы хотите отображать и отображайте.
На бумаге для себя нарисуйте входные данные и что вы хотите на выходе. А то, то не нужен документ, то нужен, но не знаю какой. :-)
Прикрепленные файлы:
19. Said-We 18.01.24 12:14 Сейчас в теме
(17) Почему дублируются? Уведомления разные.
20. Az18011993 18.01.24 17:30 Сейчас в теме
(19)Так это я понял, а можно ли как то в запросе проверить, чтоб количество совпадало документом основание.
23. Az18011993 18.01.24 18:56 Сейчас в теме
(19)
ВЫБРАТЬ
	УведомлениеОВыдачеВОтделенияМДЛП.Ссылка КАК Уведомление,
	УведомлениеОВыдачеВОтделенияМДЛП.Основание КАК Отпуск,
	УведомлениеОВыдачеВОтделенияМДЛПТовары.Номенклатура КАК Номенклатура,
	УведомлениеОВыдачеВОтделенияМДЛПТовары.Серия КАК Серия,
	УведомлениеОВыдачеВОтделенияМДЛПТовары.Количество КАК Количество
ПОМЕСТИТЬ ВТ_Уведомления
ИЗ
	Документ.УведомлениеОВыдачеВОтделенияМДЛП КАК УведомлениеОВыдачеВОтделенияМДЛП
		ЛЕВОЕ СОЕДИНЕНИЕ Документ.УведомлениеОВыдачеВОтделенияМДЛП.Товары КАК УведомлениеОВыдачеВОтделенияМДЛПТовары
		ПО (УведомлениеОВыдачеВОтделенияМДЛП.Ссылка = УведомлениеОВыдачеВОтделенияМДЛПТовары.Ссылка)
ГДЕ
	УведомлениеОВыдачеВОтделенияМДЛП.Дата > &Дата
	И УведомлениеОВыдачеВОтделенияМДЛП.Проведен
	И УведомлениеОВыдачеВОтделенияМДЛПТовары.Номенклатура = &Номенклатура
;

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

СГРУППИРОВАТЬ ПО
	ОтпускТоваровВОтделениеТовары.Ссылка,
	ОтпускТоваровВОтделениеТовары.Номенклатура,
	ОтпускТоваровВОтделениеТовары.СерияНоменклатуры,
	ОтпускТоваровВОтделениеТовары.Количество
;

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

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТ_Результат.Ссылка КАК Ссылка,
	ВТ_Результат.Номенклатура КАК Номенклатура,
	ВТ_Результат.СерияНоменклатуры КАК СерияНоменклатуры,
	ВЫБОР
		КОГДА ВТ_Результат.НомерЗаписи > 1
				И ВТ_Результат.КоличествоУведомлений > 1
				И ВТ_Результат.КоличествоОтпуска = ВТ_Отпуска.Количество
			ТОГДА 0
		ИНАЧЕ ВТ_Результат.КоличествоОтпуска
	КОНЕЦ КАК КоличествоОтпуска,
	ВТ_Результат.Уведомление КАК Уведомление,
	ВТ_Результат.КоличествоВУведомлении КАК КоличествоВУведомлении
ИЗ
	ВТ_Отпуска КАК ВТ_Отпуска
		ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Результат КАК ВТ_Результат
		ПО (ВТ_Результат.Ссылка = ВТ_Отпуска.Ссылка
				И ВТ_Результат.Номенклатура = ВТ_Результат.Номенклатура
				И ВТ_Результат.СерияНоменклатуры = ВТ_Результат.СерияНоменклатуры)
Показать


Как вариант придумал такое извращение...
Прикрепленные файлы:
21. Said-We 18.01.24 17:42 Сейчас в теме
(20) Брать из документа основания.
22. Az18011993 18.01.24 17:53 Сейчас в теме
(21)Так мне нужно чтобы выводилось количество из уведомлений и из основания
Оставьте свое сообщение

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