выбрать по одному договору каждого контрагента

1. vechiy 35 14.08.20 09:35 Сейчас в теме
хочется в запросе выбрать по одному (самому старшему по дате) договору для каждого контрагента, совсем не соображу как это сделать

типа, из этого запроса сделать вложенный и выбрать первые 1 - это не то
ВЫБРАТЬ  различные
	ДоговорыКонтрагентов.Контрагент КАК Контрагент,
	ДоговорыКонтрагентов.Ссылка КАК Ссылка,
	макс(ДоговорыКонтрагентов.Дата) КАК Дата,
	ДоговорыКонтрагентов.Номер КАК Номер,
	ДоговорыКонтрагентов.рздКоличествоДнейОтсрочки КАК рздКоличествоДнейОтсрочки,
	ДоговорыКонтрагентов.рздТипДнейОтсрочкиОплаты КАК рздТипДнейОтсрочкиОплаты
ИЗ
	Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
ГДЕ
	ДоговорыКонтрагентов.Партнер.Клиент = ИСТИНА
	И ДоговорыКонтрагентов.рздКоличествоДнейОтсрочки <> 0
	И ДоговорыКонтрагентов.Статус = &Действует
	И ДоговорыКонтрагентов.ТипДоговора = &СПокупателем

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

УПОРЯДОЧИТЬ ПО
	Контрагент,
	Дата УБЫВ
Показать
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
12. vechiy 35 14.08.20 10:17 Сейчас в теме
в общем так заработало
ВЫБРАТЬ 
	ДоговорыКонтрагентов.Контрагент КАК Контрагент,
	ДоговорыКонтрагентов.Ссылка КАК Ссылка,
	ДоговорыКонтрагентов.Дата КАК Дата,
	ДоговорыКонтрагентов.Номер КАК Номер,
	ДоговорыКонтрагентов.рздКоличествоДнейОтсрочки КАК рздКоличествоДнейОтсрочки,
	ДоговорыКонтрагентов.рздТипДнейОтсрочкиОплаты КАК рздТипДнейОтсрочкиОплаты
поместить исх
ИЗ
	Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
ГДЕ
	ДоговорыКонтрагентов.Партнер.Клиент = ИСТИНА
	И ДоговорыКонтрагентов.рздКоличествоДнейОтсрочки <> 0
	И ДоговорыКонтрагентов.Статус = &Действует
	И ДоговорыКонтрагентов.ТипДоговора = &СПокупателем
;
выбрать исх.контрагент, максимум(дата)
поместить груп
из исх как исх
сгруппировать по исх.контрагент
;
выбрать
	исх.Контрагент КАК Контрагент,
	исх.Ссылка КАК Ссылка,
	исх.Дата КАК Дата,
	исх.Номер КАК Номер,
	исх.рздКоличествоДнейОтсрочки КАК рздКоличествоДнейОтсрочки,
	исх.рздТипДнейОтсрочкиОплаты КАК рздТипДнейОтсрочкиОплаты
из исх как исх
внутреннее соединение груп как груп по исх.контрагент = груп.контрагент и исх.дата = груп.дата
Показать
alex-l19041; +1 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
4. alex-l19041 8 14.08.20 09:52 Сейчас в теме
(1) во временную таблицу получить для всех контрагентов нужную дату договоров (самую старшую ), затем соединяете справочник ДоговорыКонтрагентов с этой таблицей по условию равенства контрагента и даты договора - получите для каждого контрагента один договор

что-то типа
ВЫБРАТЬ 
ДоговорыКонтрагентов.Контрагент КАК Контрагент,

макс(ДоговорыКонтрагентов.Дата) КАК Дата
Поместить ТаблицаМаксДатыДоговоров
ИЗ
Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов


СГРУППИРОВАТЬ ПО
ДоговорыКонтрагентов.Контрагент
Показать
7. vechiy 35 14.08.20 10:07 Сейчас в теме
(4) да, просто это у меня не работает почему-то

второй запрос не выполняется

ВЫБРАТЬ 
	ДоговорыКонтрагентов.Контрагент КАК Контрагент,
	ДоговорыКонтрагентов.Ссылка КАК Ссылка,
	ДоговорыКонтрагентов.Дата КАК Дата,
	ДоговорыКонтрагентов.Номер КАК Номер,
	ДоговорыКонтрагентов.рздКоличествоДнейОтсрочки КАК рздКоличествоДнейОтсрочки,
	ДоговорыКонтрагентов.рздТипДнейОтсрочкиОплаты КАК рздТипДнейОтсрочкиОплаты
поместить исх
ИЗ
	Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
ГДЕ
	ДоговорыКонтрагентов.Партнер.Клиент = ИСТИНА
	И ДоговорыКонтрагентов.рздКоличествоДнейОтсрочки <> 0
	И ДоговорыКонтрагентов.Статус = &Действует
	И ДоговорыКонтрагентов.ТипДоговора = &СПокупателем
;
выбрать исх.контрагент, максимум(дата)
поместить груп
из исх как исх
;
Показать

ошибка: Поле не входит в группу "исх.контрагент"
выбрать <<?>>исх.контрагент, максимум(дата)
9. alex-l19041 8 14.08.20 10:12 Сейчас в теме +0.25 $m
(7)
выбрать исх.контрагент, максимум(дата)
поместить груп
из исх как исх
- не хватает СГРУППИРОВАТЬ ПО
10. vechiy 35 14.08.20 10:14 Сейчас в теме
8. Sergex 58 14.08.20 10:08 Сейчас в теме
(4) А как соединятся договоры которых два и у обеих даты не указаны?
5. Sergex 58 14.08.20 09:56 Сейчас в теме
(1) Обычная проблема таких задачек - а у договоров даты то не заполнены! :)

Могу накидать вам запрос которые выберет по одному договору первому по ссылке

ВЫБРАТЬ
	МИНИМУМ(ДоговорыКонтрагентов.Дата) КАК Дата,
	ДоговорыКонтрагентов.Контрагент КАК Контрагент,
	МИНИМУМ(ДоговорыКонтрагентов.Ссылка) КАК Ссылка
ИЗ
	Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
ГДЕ
	ДоговорыКонтрагентов.Организация = &Организация

СГРУППИРОВАТЬ ПО
	ДоговорыКонтрагентов.Контрагент
Показать


Так как строить ВТ по датам и по ним потом соединяться с договорами можно ТОЛЬКО если:
1 -100% дат в договорах заполнены
2 - ни у каких двух договоров одного контрагента с одной организацией нет одинаковых дат

Попытка построить запрос при несоблюдении этих двух условий приведет к мультипликации записей при левом соединении по неуникальным датам к таблице договоров.

Вот вам тупой запрос который скорее выбирает младшие по ссылкам ибо технически можно предположить что чем младше ссылка тем старше договор. Ну и для отвода глаз там еще и младшая дата :) хотя в выборке те что выбираются и имеют дату соответствуют выбранной дате.
6. vechiy 35 14.08.20 10:02 Сейчас в теме
(5) да причем тут даты, все там заполнено
13. Sergex 58 14.08.20 10:22 Сейчас в теме
(6) Если даты заполнены тогдась

ВЫБРАТЬ
	МИНИМУМ(ДоговорыКонтрагентов.Дата) КАК Дата,
	ДоговорыКонтрагентов.Контрагент КАК Контрагент,
	ДоговорыКонтрагентов.Организация КАК Организация
ПОМЕСТИТЬ МинДаты
ИЗ
	Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
ГДЕ
	ДоговорыКонтрагентов.Организация = &Организация

СГРУППИРОВАТЬ ПО
	ДоговорыКонтрагентов.Контрагент,
	ДоговорыКонтрагентов.Организация
;

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


Но сразу надо проверить число записей в ВТ и в финальной выборке.
Если в ВТ число записей меньше чем в финальной - у вас бардачекс с датами...
2. vechiy 35 14.08.20 09:38 Сейчас в теме
видимо нужно поместить
3. burgomister 59 14.08.20 09:47 Сейчас в теме
Для какой конфигурации?
11. 1cmailru 4 14.08.20 10:14 Сейчас в теме +0.25 $m
//----------------
// Задача:
//Выбрать последние по дате договора, удовлетворяющие некоторым условиям
// Решение:
//1. Во временную таблицу выберем все договора подходящие под условия.
//2. Во вторую временную таблицу выберем для каждого договора максимальную дату
//3. Выберем договор с максимальной датой.





ВЫБРАТЬ различные
ДоговорыКонтрагентов.Контрагент КАК Контрагент,
ДоговорыКонтрагентов.Ссылка КАК Договор,
ДоговорыКонтрагентов.Дата КАК ДатаДоговора,
ДоговорыКонтрагентов.Номер КАК НомерДоговора,
ДоговорыКонтрагентов.рздКоличествоДнейОтсрочки КАК КоличествоДнейОтсрочки,
ДоговорыКонтрагентов.рздТипДнейОтсрочкиОплаты КАК ТипДнейОтсрочкиОплаты
Поместить втДоговора
ИЗ
Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
ГДЕ
ДоговорыКонтрагентов.Партнер.Клиент = ИСТИНА
И ДоговорыКонтрагентов.рздКоличествоДнейОтсрочки <> 0
И ДоговорыКонтрагентов.Статус = &Действует
И ДоговорыКонтрагентов.ТипДоговора = &СПокупателем

;
////////////-------------------

Выбрать 
	вт.Контрагент как Контрагент,
	Максимум(вт.ДатаДОговора) как МаксДатаДговора
Поместить втМаксДаты

из
	втДоговора ка вт
сгруппировать по 
	вт.Контрагент
;
//-------------------------

Выбрать

	вт.*
	
из
	втМаксДаты
	Левое соединение втДоговора как вт
	ПО втМаксДаты.Контрагент = вт.Контрагент
	и втМаксДаты.МаксДатаДоговора = вт.ДатаДоговора
Показать
12. vechiy 35 14.08.20 10:17 Сейчас в теме
в общем так заработало
ВЫБРАТЬ 
	ДоговорыКонтрагентов.Контрагент КАК Контрагент,
	ДоговорыКонтрагентов.Ссылка КАК Ссылка,
	ДоговорыКонтрагентов.Дата КАК Дата,
	ДоговорыКонтрагентов.Номер КАК Номер,
	ДоговорыКонтрагентов.рздКоличествоДнейОтсрочки КАК рздКоличествоДнейОтсрочки,
	ДоговорыКонтрагентов.рздТипДнейОтсрочкиОплаты КАК рздТипДнейОтсрочкиОплаты
поместить исх
ИЗ
	Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
ГДЕ
	ДоговорыКонтрагентов.Партнер.Клиент = ИСТИНА
	И ДоговорыКонтрагентов.рздКоличествоДнейОтсрочки <> 0
	И ДоговорыКонтрагентов.Статус = &Действует
	И ДоговорыКонтрагентов.ТипДоговора = &СПокупателем
;
выбрать исх.контрагент, максимум(дата)
поместить груп
из исх как исх
сгруппировать по исх.контрагент
;
выбрать
	исх.Контрагент КАК Контрагент,
	исх.Ссылка КАК Ссылка,
	исх.Дата КАК Дата,
	исх.Номер КАК Номер,
	исх.рздКоличествоДнейОтсрочки КАК рздКоличествоДнейОтсрочки,
	исх.рздТипДнейОтсрочкиОплаты КАК рздТипДнейОтсрочкиОплаты
из исх как исх
внутреннее соединение груп как груп по исх.контрагент = груп.контрагент и исх.дата = груп.дата
Показать
alex-l19041; +1 Ответить
14. Sergex 58 14.08.20 10:27 Сейчас в теме
15. Vitaly1C8 14.08.20 10:42 Сейчас в теме
Коротенький пример для 10 Контрагентов :)


ВЫБРАТЬ 
  ДоговорыКонтрагентов1.Контрагент КАК Контрагент,
  ДоговорыКонтрагентов1.Ссылка КАК Ссылка,
  ДоговорыКонтрагентов1.Дата КАК Дата,
  ДоговорыКонтрагентов1.Номер КАК Номер
ИЗ
  Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов1
ВНУТРЕННЕЕ СОЕДИНЕНИЕ 
  (
ВЫБРАТЬ ПЕРВЫЕ 10   // Убрать после тестирования
  ДоговорыКонтрагентов.Контрагент КАК Контрагент,  
  МАКСИМУМ(ДоговорыКонтрагентов.Дата) КАК Дата
ИЗ
  Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов 
ГДЕ
  ДоговорыКонтрагентов.Контрагент <> ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)
СГРУППИРОВАТЬ ПО
  ДоговорыКонтрагентов.Контрагент

  ) КАК Макс
ПО Макс.Контрагент = ДоговорыКонтрагентов1.Контрагент
 И Макс.Дата = ДоговорыКонтрагентов1.Дата
Показать
Оставьте свое сообщение

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