С двух таблиц сделать одну

1. AlexeyMalko 13.03.17 12:43 Сейчас в теме
Есть две таблички с одинаковыми колонками - Контрагент и количество, одна таблица за предыдущий период, вторая за текущий - анализ продаж такой себе. Как так сделать табличку - один столбик все контрагенты, второй с цифрами за предыдущий период, третья колонка с цифрами за текущий период. Не хватает пока что знаний для реализации. Спасибо
По теме из базы знаний
Найденные решения
6. japopov 68 13.03.17 13:08 Сейчас в теме
Можно двумя вариантами (предполагаю, что таблицы называются ТЗТекущая и ТЗПредыдущая):
1) перебор (проще, но медленнее, и работает в том числе на Клиенте с небольшими изменениями)
	ТЗПредыдущая = Новый ТаблицаЗначений;
	ТЗТекущая = Новый ТаблицаЗначений;
	ТЗОбъединенная = Новый ТаблицаЗначений;
	ТЗОбъединенная.Колонки.Добавить("Контрагент",Новый ОписаниеТипов("СправочникСсылка.Контрагенты"));
	ТЗОбъединенная.Колонки.Добавить("КоличествоПредыдущее",Новый ОписаниеТипов("Число"));
	ТЗОбъединенная.Колонки.Добавить("КоличествоТекущее",Новый ОписаниеТипов("Число"));
	Для Каждого Строка1 Из ТЗПредыдущая Цикл
		НС = ТЗОбъединенная.Добавить();
		НС.Контрагент = Строка1.Контрагент;
		НС.КоличествоПредыдущее = Строка1.Количество;
		Строка2 = ТЗТекущая.Найти(Строка1.Контрагент,"Контрагент");
		Если Строка2<>Неопределено Тогда
			НС.КоличествоТекущее = Строка2.Количество;
		Иначе
			НС.КоличествоТекущее = 0;
		КонецЕсли;
	КонецЦикла;
	Для Каждого Строка2 Из ТЗТекущая Цикл
		Строка1 = ТЗПредыдущая.Найти(Строка2.Контрагент,"Контрагент");
		Если Строка1=Неопределено Тогда
			НС = ТЗОбъединенная.Добавить();
			НС.Контрагент = Строка2.Контрагент;
			НС.КоличествоПредыдущее = 0;
			НС.КоличествоТекущее = Строка2.Количество;
		КонецЕсли;
	КонецЦикла;
Показать


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


В этом запросе объединяются обе таблицы, причём "пустых" значений null не получается: если по контрагенту в одной из таблиц отсутствуют сведения, то в результате в соответствующей колонке будет 0. Это Вам поможет потом обрабатывать. Ну, и мелкие оптимизации вроде индексов, чтобы работало быстрее...
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. kolya_tlt 86 13.03.17 13:02 Сейчас в теме
(1) запишитесь на курсы по запросам. Можно сразу на курс 10774
2. antz 13.03.17 12:59 Сейчас в теме
Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	тзПрошлыйПериод.Контрагент,
	|	тзПрошлыйПериод.Количество КАК КоличествоЗаПрошлыйПериод
	|ПОМЕСТИТЬ ВТ_ПрошлыйПериод
	|ИЗ
	|	&тзПрошлыйПериод КАК тзПрошлыйПериод
	|;
	|
	|////////////////////////////////////////////////////////////­////////////////////
	|ВЫБРАТЬ
	|	тзТекущийПериод.Контрагент,
	|	тзТекущийПериод.Количество КАК КоличествоЗаТекущийПериод
	|ПОМЕСТИТЬ ВТ_ТекущийПериод
	|ИЗ
	|	&тзТекущийПериод КАК тзТекущийПериод
	|;
	|
	|////////////////////////////////////////////////////////////­////////////////////
	|ВЫБРАТЬ
	|	ВложенныйЗапрос.Контрагент,
	|	СУММА(ВложенныйЗапрос.КоличествоЗаПрошлыйПериод) КАК КоличествоЗаПрошлыйПериод,
	|	СУММА(ВложенныйЗапрос.КоличествоЗаТекущийПериод) КАК КоличествоЗаТекущийПериод
	|ИЗ
	|	(ВЫБРАТЬ
	|		ВТ_ПрошлыйПериод.Контрагент КАК Контрагент,
	|		ВТ_ПрошлыйПериод.КоличествоЗаПрошлыйПериод КАК КоличествоЗаПрошлыйПериод,
	|		0 КАК КоличествоЗаТекущийПериод
	|	ИЗ
	|		ВТ_ПрошлыйПериод КАК ВТ_ПрошлыйПериод
	|	
	|	ОБЪЕДИНИТЬ ВСЕ
	|	
	|	ВЫБРАТЬ
	|		ВТ_ТекущийПериод.Контрагент,
	|		0,
	|		ВТ_ТекущийПериод.КоличествоЗаТекущийПериод
	|	ИЗ
	|		ВТ_ТекущийПериод КАК ВТ_ТекущийПериод) КАК ВложенныйЗапрос
	|
	|СГРУППИРОВАТЬ ПО
	|	ВложенныйЗапрос.Контрагент";
	
	Запрос.УстановитьПараметр("тзПрошлыйПериод", тзЗаПрошлыйПериод);
	Запрос.УстановитьПараметр("тзТекущийПериод", тзЗаТекущийПериод);
	тзРезультат = Запрос.Выполнить().Выгрузить();
Показать
4. olegmedvedev 65 13.03.17 13:03 Сейчас в теме
я бы сделал так
1) обе таблицы загнал в MXL
2) передал их параметрами в запрос
ВЫБРАТЬ
	Внешний.Контрагент,
	Внешний.СуммаПред
ПОМЕСТИТЬ врТЗВнеш
ИЗ
	&ВнешнийИсточник КАК Внешний
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	Внешний2.Контрагент,
	Внешний2.СуммТекущ
ПОМЕСТИТЬ врТЗВнеш2
ИЗ
	&ВнешнийИсточник2 КАК Внешний2
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	врТЗВнеш.Контрагент,
	врТЗВнеш.СуммаПред,
	врТЗВнеш2.СуммТекущ
ИЗ
	врТЗВнеш КАК врТЗВнеш
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ врТЗВнеш2 КАК врТЗВнеш2
		ПО врТЗВнеш.Контрагент = врТЗВнеш2.Контрагент
Показать

3) Результатом будет соединение двух таблиц в одну по наименованию контрагента

Скриншоты во вложениях
Прикрепленные файлы:
СписокКонтрагентаПред.mxl
СписокКонтрагентаТек.mxl
7. AlexeyMalko 13.03.17 13:11 Сейчас в теме
Всем спасибо, получилось. Теперь буду знать, я как то не могу всё это познать вместе по отдельности делаю , а слепить не хватает знаний. Курсы по запросам, было бы неплохо, только не понял что такое " Можно сразу на курс 10774"
(4) Это уже круто вообще , только не понял зачем выгружать
Всё спасибо всем, по сути все одно и тоже предлагают и ОНО правильно - запросом с ВТ.
10. japopov 68 13.03.17 13:14 Сейчас в теме
(7)
(4) Это уже круто вообще
Увы, нет. Круто и корректно - это как в (2), (5), (6).
8. vadim1011985 100 13.03.17 13:11 Сейчас в теме
(4) а если контрагенты разные ,точнее в этом году есть такой контрагент а в прошлом не было
9. japopov 68 13.03.17 13:13 Сейчас в теме
(8) Правильно. А ещё неплохо бы в этом случае не получать Null в качестве суммы! Ну, и чтобы запрос быстрее отрабатывал...
5. Anchoret 60 13.03.17 13:06 Сейчас в теме
Как-то так, наверно. Помещаешь свои таблицы в запрос и соединяешь их

"ВЫБРАТЬ
|	ТЗ1.Контрагент,
|	ТЗ1.КоличествоПредыдущийМесяц
|ПОМЕСТИТЬ ВТ_ПредыдущийМесяц
|ИЗ
|	&ТЗ1 КАК ТЗ1
|;
|
|////////////////////////////////////////////////////////////­////////////////////
|ВЫБРАТЬ
|	ТЗ2.Контрагент,
|	ТЗ2.КоличествоТекущийМесяц
|ПОМЕСТИТЬ ВТ_ТекущийМесяц
|ИЗ
|	&ТЗ2 КАК ТЗ2
|;
|
|////////////////////////////////////////////////////////////­////////////////////
|ВЫБРАТЬ
|	ВТ_ПредыдущийМесяц.Контрагент,
|	ВТ_ПредыдущийМесяц.КоличествоПредыдущийМесяц,
|	ВТ_ТекущийМесяц.КоличествоТекущийМесяц,
|	ВТ_ТекущийМесяц.Контрагент КАК Контрагент1
|ИЗ
|	ВТ_ПредыдущийМесяц КАК ВТ_ПредыдущийМесяц
|		ПОЛНОЕ СОЕДИНЕНИЕ ВТ_ТекущийМесяц КАК ВТ_ТекущийМесяц
|		ПО ВТ_ПредыдущийМесяц.Контрагент = ВТ_ТекущийМесяц.Контрагент"
Показать
6. japopov 68 13.03.17 13:08 Сейчас в теме
Можно двумя вариантами (предполагаю, что таблицы называются ТЗТекущая и ТЗПредыдущая):
1) перебор (проще, но медленнее, и работает в том числе на Клиенте с небольшими изменениями)
	ТЗПредыдущая = Новый ТаблицаЗначений;
	ТЗТекущая = Новый ТаблицаЗначений;
	ТЗОбъединенная = Новый ТаблицаЗначений;
	ТЗОбъединенная.Колонки.Добавить("Контрагент",Новый ОписаниеТипов("СправочникСсылка.Контрагенты"));
	ТЗОбъединенная.Колонки.Добавить("КоличествоПредыдущее",Новый ОписаниеТипов("Число"));
	ТЗОбъединенная.Колонки.Добавить("КоличествоТекущее",Новый ОписаниеТипов("Число"));
	Для Каждого Строка1 Из ТЗПредыдущая Цикл
		НС = ТЗОбъединенная.Добавить();
		НС.Контрагент = Строка1.Контрагент;
		НС.КоличествоПредыдущее = Строка1.Количество;
		Строка2 = ТЗТекущая.Найти(Строка1.Контрагент,"Контрагент");
		Если Строка2<>Неопределено Тогда
			НС.КоличествоТекущее = Строка2.Количество;
		Иначе
			НС.КоличествоТекущее = 0;
		КонецЕсли;
	КонецЦикла;
	Для Каждого Строка2 Из ТЗТекущая Цикл
		Строка1 = ТЗПредыдущая.Найти(Строка2.Контрагент,"Контрагент");
		Если Строка1=Неопределено Тогда
			НС = ТЗОбъединенная.Добавить();
			НС.Контрагент = Строка2.Контрагент;
			НС.КоличествоПредыдущее = 0;
			НС.КоличествоТекущее = Строка2.Количество;
		КонецЕсли;
	КонецЦикла;
Показать


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


В этом запросе объединяются обе таблицы, причём "пустых" значений null не получается: если по контрагенту в одной из таблиц отсутствуют сведения, то в результате в соответствующей колонке будет 0. Это Вам поможет потом обрабатывать. Ну, и мелкие оптимизации вроде индексов, чтобы работало быстрее...
Оставьте свое сообщение

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