Кривая группировка запроса.

1. Intercititude 30.06.20 15:05 Сейчас в теме
Добрый день всем!
Есть запрос:
ВЫБРАТЬ

                ЛадСогласСуммаСрезПоследних.Период КАК ДатаНачала,

                ЛадСогласСуммаСрезПоследних.ДатаОкончанияДействия КАК ДатаКонца,

                МАКСИМУМ(ЛадСогласСуммаСрезПоследних.Сумма) КАК СогласСумма

ИЗ

                РегистрСведений.ЛадСогласСумма.СрезПоследних(

                                               &ДатаНачала,

                                               Контрагент = &Контрагент

                                                               И (&ДатаОкончания <= ДатаОкончанияДействия

                                                                              ИЛИ ДатаОкончанияДействия = ДАТАВРЕМЯ(1, 1, 1))) КАК ЛадСогласСуммаСрезПоследних

 

СГРУППИРОВАТЬ ПО

                ЛадСогласСуммаСрезПоследних.Период,

                ЛадСогласСуммаСрезПоследних.ДатаОкончанияДействия
Показать


Проблема в следующем.
Если есть два документа с разными СогласСуммами и промежуток их пересекается, то не отрабатывает функция МАКСИМУМ. То есть не берётся большая сумма!
Если же добавить поле контрагент в группировку и убрать ДатаНачала и ДатаКонца, тогда отрабатывает как надо.
Собственно как переделать мне запрос, чтобы я смог отгруппировать корректно и при этом ещё и полчить ДатуНачала и ДатуКонца?
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
22. vadim.semyonov.rzn 01.07.20 10:58 Сейчас в теме +0.5 $m
(20) Требуется подробное разжевывание? Извольте.
ВЫБРАТЬ
	ЛадСогласСуммаСрезПоследних.Период КАК ДатаНачала,
	ЛадСогласСуммаСрезПоследних.ДатаОкончанияДействия КАК ДатаКонца,
	ПоискМаксимума.МаксСумма КАК СогласСумма
ИЗ
	(ВЫБРАТЬ
		МАКСИМУМ(ЛадСогласСуммаСрезПоследних.Сумма) КАК МаксСумма
	ИЗ
		РегистрСведений.ЛадСогласСумма.СрезПоследних(
			&ДатаНачала,
			Контрагент = &Контрагент
				И (&ДатаОкончания <= ДатаОкончанияДействия
				ИЛИ ДатаОкончанияДействия = ДАТАВРЕМЯ(1, 1, 1))) КАК ЛадСогласСуммаСрезПоследних) КАК ПоискМаксимума
ЛЕВОЕ СОЕДИНЕНИЕ
	РегистрСведений.ЛадСогласСумма.СрезПоследних(
		&ДатаНачала,
		Контрагент = &Контрагент
			И (&ДатаОкончания <= ДатаОкончанияДействия
			ИЛИ ДатаОкончанияДействия = ДАТАВРЕМЯ(1, 1, 1))) КАК ЛадСогласСуммаСрезПоследних
ПО ЛадСогласСуммаСрезПоследних.Сумма = ПоискМаксимума.МаксСумма
Показать
Остальные ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
18. nomad_irk 71 30.06.20 19:25 Сейчас в теме
(1)Вы структуру РС покажете или так и будем продолжать битву экстрасенсов?
19. Intercititude 30.06.20 20:03 Сейчас в теме
(18)вся структура в запросе в теме. Единственное:Переодический (день)
21. nomad_irk 71 30.06.20 20:27 Сейчас в теме
(19)Нет структуры ни в одном сообщении. Какие измерения/ресурсы/реквизиты у регистра сведений? РС подчинен регистратору?
25. Intercititude 02.07.20 09:04 Сейчас в теме
(21) Ну пожалуйста, и какой смысл в этом..
Подчинен одному документу да.
Прикрепленные файлы:
27. nomad_irk 71 02.07.20 09:20 Сейчас в теме
(25)Если вам уже предоставили решение и вы с этим решением согласны, смысла нет.
23. davealone 165 01.07.20 15:48 Сейчас в теме
(1) Похоже ДатаОкончанияДействия вообще лучше ресурсом сделать а не измерением?
Иначе по одному контрагенту может быть несколько пересекающихся периодов (с 1 по 5, с 2 по 6, с 3 по 5).
Если оставлять можно либо тот же Макс для дат начала и окончания взять.
Либо срезом получить все, определить макс и потом взять именно запись где сумма максимальная, как писали выше
26. Intercititude 02.07.20 09:06 Сейчас в теме
(23) Подумаю по поводу ресурса, механизм же в работе просто и не хотелось бы менять.
в (22) уже описали про макс, выводит всё-равно две строки..
28. davealone 165 02.07.20 10:25 Сейчас в теме
(26) С такой структурой (измерением) логика двусмысленная. Почему именно макс сумма? На контрагента выделили 1 числа на две недели до 15 числа сумму 100000, а потом по какой-то причине решили уменьшить с 4 по 15 до 80000. Обычно ожидается, что более позднее назначение должно браться, т. е. по Макс периоду, а не Макс сумма из двух назначений
29. Intercititude 02.07.20 10:57 Сейчас в теме
(28) Логика такова, что необходимо брать всегда большую сумму. Подразумевается,что пользователь при пересечении периода указывает всегда Большую сумму.
По идее одинаковых сумм не должно быть. Так что в (22) корректно написан запрос.
Ну вроде как :)
2. toypaul 63 30.06.20 15:18 Сейчас в теме
структура регистра
картинка данных
результат как есть сейчас
картинка как надо
nomad_irk; alex-l19041; +2 Ответить
5. Intercititude 30.06.20 15:32 Сейчас в теме
(2) в (4) описал подробно.
3. Jimbo 9 30.06.20 15:18 Сейчас в теме
Каша в голове, группировки и агрегаты это же так просто.

Что там у вас пересекается ? группировка по контрагенту и даст максимум.

Какова изначально задача ?
4. Intercititude 30.06.20 15:25 Сейчас в теме
(3) На выходе из запроса мне необходимо получить три значения: ДатаНачала,ДатаКонца и СоглаСумма.

Сейчас исходя из запроса в теме в итоге выходит две строки:
1) Соглассумма: 40000 ; ДатаНачала: 29.06.2020; ДатаКонца: 30.06.2020
2) Соглассумма: 57000 ; ДатаНачала: 30.06.2020; ДатаКонца: 02.07.2020

То есть максимум не отрабатывает!
Если же убрать ДатаНачала и ДатаКонца из группировки и добавить контрагента, то берётся одна строка 57000,как и необходимо. Берётся большая сумма при пересечении дат.

Но мне необходимы значения ДатаНачала и ДатаКонца ! Если к ним в группировку добавить контрагента, то вылазят всё-равно две строки!!!
Пытался через вложеный запрос или пакет запросов,безуспешно.
6. toypaul 63 30.06.20 15:52 Сейчас в теме
(4) сначала надо найти максимум суммы, затем по значению этой суммы найти дату начала и дату конца. запрос писать лень
7. Intercititude 30.06.20 16:02 Сейчас в теме
(6) То есть по значению суммы? А если куча одинаковых сумм.

1) В первом подзапросе отгруппировать по контрагенту и получить максмум сумму(поместить в вт)
2) Во втором итоговом подзапросе связать вт с этим же регистром по контрагенту и получить даты
так имеете ввиду ?
8. vadim.semyonov.rzn 30.06.20 17:05 Сейчас в теме
(7) Лучше вычислить максимальную сумму без лишних группировок во вложенном запросе и результат вытаскивать в качестве поля в результирующий запрос.
9. Intercititude 30.06.20 17:27 Сейчас в теме
А связывать как и с чем в результирующем запросе ?
17. vadim.semyonov.rzn 30.06.20 19:14 Сейчас в теме
(9) По приведенному в вопросе тексту запроса нет необходимости связывать. Просто берете полученное значение из вложенного запроса. Вложенный запрос - с суммированием, но без группировок:
ВЫБРАТЬ

                МАКСИМУМ(ЛадСогласСуммаСрезПоследних.Сумма) КАК МаксСумма

ИЗ

                РегистрСведений.ЛадСогласСумма.СрезПоследних(

                                               &ДатаНачала,

                                               Контрагент = &Контрагент

                                                               И (&ДатаОкончания <= ДатаОкончанияДействия

                                                                              ИЛИ ДатаОкончанияДействия = ДАТАВРЕМЯ(1, 1, 1))) КАК ЛадСогласСуммаСрезПоследних
Показать
20. Intercititude 30.06.20 20:14 Сейчас в теме
(17)мне необходима на выходе
дата начала и датаконца
22. vadim.semyonov.rzn 01.07.20 10:58 Сейчас в теме +0.5 $m
(20) Требуется подробное разжевывание? Извольте.
ВЫБРАТЬ
	ЛадСогласСуммаСрезПоследних.Период КАК ДатаНачала,
	ЛадСогласСуммаСрезПоследних.ДатаОкончанияДействия КАК ДатаКонца,
	ПоискМаксимума.МаксСумма КАК СогласСумма
ИЗ
	(ВЫБРАТЬ
		МАКСИМУМ(ЛадСогласСуммаСрезПоследних.Сумма) КАК МаксСумма
	ИЗ
		РегистрСведений.ЛадСогласСумма.СрезПоследних(
			&ДатаНачала,
			Контрагент = &Контрагент
				И (&ДатаОкончания <= ДатаОкончанияДействия
				ИЛИ ДатаОкончанияДействия = ДАТАВРЕМЯ(1, 1, 1))) КАК ЛадСогласСуммаСрезПоследних) КАК ПоискМаксимума
ЛЕВОЕ СОЕДИНЕНИЕ
	РегистрСведений.ЛадСогласСумма.СрезПоследних(
		&ДатаНачала,
		Контрагент = &Контрагент
			И (&ДатаОкончания <= ДатаОкончанияДействия
			ИЛИ ДатаОкончанияДействия = ДАТАВРЕМЯ(1, 1, 1))) КАК ЛадСогласСуммаСрезПоследних
ПО ЛадСогласСуммаСрезПоследних.Сумма = ПоискМаксимума.МаксСумма
Показать
24. Intercititude 02.07.20 09:01 Сейчас в теме
(22) Спасибо.
Единственное, если и правда будет две одинаковых сумм. То возьмётся первая строка и соответственно ДатаКонца и ДатаНачала будет некорректны.

Выходит одно решение запихать ДатаОкончанияДействия в ресурсы и делать макс по нему так же ?
30. Intercititude 02.07.20 13:23 Сейчас в теме
(22) и еще,если регистр пуст,то все равно выходит null на выходе у значении
Почему так?
16. toypaul 63 30.06.20 19:01 Сейчас в теме
(7)
А если куча одинаковых сумм.


не понял почему я должен дать ответ на этот вопрос. это главный вопрос, на который точно не я должен знать ответ
10. LackyZZ 30.06.20 18:00 Сейчас в теме
Найдите макс сумму во вложенном запросе дата сумма, условия дата в периоде. Потом объедините с вашим запросом.
11. Intercititude 30.06.20 18:04 Сейчас в теме
(10)если во вложеном использую дату,то будет две строки
12. LackyZZ 30.06.20 18:20 Сейчас в теме
(11)Хорошо, а если 2 одинаковые суммы будет в периоде допустим 10к на 10.10.10 и 10к на 12.10.10 какой результат должен быть ? контрагент один и тот же
Просто если нужен будет максимум нужно 2 вложенных использовать. если обе подходят то один
13. Intercititude 30.06.20 18:26 Сейчас в теме
(12) Так и возьмёт 10к как и надо,тут важнее уже датаначала и датаконца чтобы верное взялось.
14. LackyZZ 30.06.20 18:29 Сейчас в теме
(13)Под руками была только 1.6 для беларуси. Выводит макс число на макс дату. периоды можете сами подставить и посмотреть что получилось. таблица услуги.
ВЫБРАТЬ
	МАКСИМУМ(РеализацияТоваровУслугУслуги.Ссылка.Дата) КАК Дата,
	РеализацияТоваровУслугУслуги.Ссылка.Контрагент КАК Контрагент,
	МАКСИМУМ(РеализацияТоваровУслугУслуги.Сумма) КАК Сумма
ИЗ
	Документ.РеализацияТоваровУслуг.Услуги КАК РеализацияТоваровУслугУслуги
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
			МАКСИМУМ(РеализацияТоваровУслугУслуги.Ссылка.Дата) КАК Дата,
			РеализацияТоваровУслугУслуги.Ссылка.Контрагент КАК Контрагент,
			МАКСИМУМ(РеализацияТоваровУслугУслуги.Сумма) КАК Сумма
		ИЗ
			Документ.РеализацияТоваровУслуг.Услуги КАК РеализацияТоваровУслугУслуги
				ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
					РеализацияТоваровУслугУслуги.Ссылка.Контрагент КАК Контрагент,
					МАКСИМУМ(РеализацияТоваровУслугУслуги.Сумма) КАК Сумма
				ИЗ
					Документ.РеализацияТоваровУслуг.Услуги КАК РеализацияТоваровУслугУслуги
				
				СГРУППИРОВАТЬ ПО
					РеализацияТоваровУслугУслуги.Ссылка.Контрагент) КАК ВложенныйЗапрос
				ПО РеализацияТоваровУслугУслуги.Ссылка.Контрагент = ВложенныйЗапрос.Контрагент
					И РеализацияТоваровУслугУслуги.Сумма = ВложенныйЗапрос.Сумма
		
		СГРУППИРОВАТЬ ПО
			РеализацияТоваровУслугУслуги.Ссылка.Контрагент) КАК ВложенныйЗапрос
		ПО РеализацияТоваровУслугУслуги.Ссылка.Контрагент = ВложенныйЗапрос.Контрагент
			И РеализацияТоваровУслугУслуги.Сумма = ВложенныйЗапрос.Сумма

СГРУППИРОВАТЬ ПО
	РеализацияТоваровУслугУслуги.Ссылка.Контрагент

УПОРЯДОЧИТЬ ПО
	Контрагент
Показать

Если убрать второй вложеный запрос выведет по несколько дат в периоде с макс суммой.
15. LackyZZ 30.06.20 18:35 Сейчас в теме
(13)Смысл такой, в первом вложенном ищем макс сумму по контрагенту за период. Второй вложеный ищет эту макс сумму на дату. В самом запросе ищем макс дату приближенную к концу. В итоге на каждого контрагента будет по одной строке.
Оставьте свое сообщение
Вакансии
Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)

Программист 1С
Москва
зарплата от 250 000 руб.
Полный день