Добрый день всем!
Есть запрос:
Проблема в следующем.
Если есть два документа с разными СогласСуммами и промежуток их пересекается, то не отрабатывает функция МАКСИМУМ. То есть не берётся большая сумма!
Если же добавить поле контрагент в группировку и убрать ДатаНачала и ДатаКонца, тогда отрабатывает как надо.
Собственно как переделать мне запрос, чтобы я смог отгруппировать корректно и при этом ещё и полчить ДатуНачала и ДатуКонца?
Есть запрос:
ВЫБРАТЬ
ЛадСогласСуммаСрезПоследних.Период КАК ДатаНачала,
ЛадСогласСуммаСрезПоследних.ДатаОкончанияДействия КАК ДатаКонца,
МАКСИМУМ(ЛадСогласСуммаСрезПоследних.Сумма) КАК СогласСумма
ИЗ
РегистрСведений.ЛадСогласСумма.СрезПоследних(
&ДатаНачала,
Контрагент = &Контрагент
И (&ДатаОкончания <= ДатаОкончанияДействия
ИЛИ ДатаОкончанияДействия = ДАТАВРЕМЯ(1, 1, 1))) КАК ЛадСогласСуммаСрезПоследних
СГРУППИРОВАТЬ ПО
ЛадСогласСуммаСрезПоследних.Период,
ЛадСогласСуммаСрезПоследних.ДатаОкончанияДействия
ПоказатьПроблема в следующем.
Если есть два документа с разными СогласСуммами и промежуток их пересекается, то не отрабатывает функция МАКСИМУМ. То есть не берётся большая сумма!
Если же добавить поле контрагент в группировку и убрать ДатаНачала и ДатаКонца, тогда отрабатывает как надо.
Собственно как переделать мне запрос, чтобы я смог отгруппировать корректно и при этом ещё и полчить ДатуНачала и ДатуКонца?
По теме из базы знаний
Найденные решения
(20) Требуется подробное разжевывание? Извольте.
ВЫБРАТЬ
ЛадСогласСуммаСрезПоследних.Период КАК ДатаНачала,
ЛадСогласСуммаСрезПоследних.ДатаОкончанияДействия КАК ДатаКонца,
ПоискМаксимума.МаксСумма КАК СогласСумма
ИЗ
(ВЫБРАТЬ
МАКСИМУМ(ЛадСогласСуммаСрезПоследних.Сумма) КАК МаксСумма
ИЗ
РегистрСведений.ЛадСогласСумма.СрезПоследних(
&ДатаНачала,
Контрагент = &Контрагент
И (&ДатаОкончания <= ДатаОкончанияДействия
ИЛИ ДатаОкончанияДействия = ДАТАВРЕМЯ(1, 1, 1))) КАК ЛадСогласСуммаСрезПоследних) КАК ПоискМаксимума
ЛЕВОЕ СОЕДИНЕНИЕ
РегистрСведений.ЛадСогласСумма.СрезПоследних(
&ДатаНачала,
Контрагент = &Контрагент
И (&ДатаОкончания <= ДатаОкончанияДействия
ИЛИ ДатаОкончанияДействия = ДАТАВРЕМЯ(1, 1, 1))) КАК ЛадСогласСуммаСрезПоследних
ПО ЛадСогласСуммаСрезПоследних.Сумма = ПоискМаксимума.МаксСумма
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) Похоже ДатаОкончанияДействия вообще лучше ресурсом сделать а не измерением?
Иначе по одному контрагенту может быть несколько пересекающихся периодов (с 1 по 5, с 2 по 6, с 3 по 5).
Если оставлять можно либо тот же Макс для дат начала и окончания взять.
Либо срезом получить все, определить макс и потом взять именно запись где сумма максимальная, как писали выше
Иначе по одному контрагенту может быть несколько пересекающихся периодов (с 1 по 5, с 2 по 6, с 3 по 5).
Если оставлять можно либо тот же Макс для дат начала и окончания взять.
Либо срезом получить все, определить макс и потом взять именно запись где сумма максимальная, как писали выше
(26) С такой структурой (измерением) логика двусмысленная. Почему именно макс сумма? На контрагента выделили 1 числа на две недели до 15 числа сумму 100000, а потом по какой-то причине решили уменьшить с 4 по 15 до 80000. Обычно ожидается, что более позднее назначение должно браться, т. е. по Макс периоду, а не Макс сумма из двух назначений
(3) На выходе из запроса мне необходимо получить три значения: ДатаНачала,ДатаКонца и СоглаСумма.
Сейчас исходя из запроса в теме в итоге выходит две строки:
1) Соглассумма: 40000 ; ДатаНачала: 29.06.2020; ДатаКонца: 30.06.2020
2) Соглассумма: 57000 ; ДатаНачала: 30.06.2020; ДатаКонца: 02.07.2020
То есть максимум не отрабатывает!
Если же убрать ДатаНачала и ДатаКонца из группировки и добавить контрагента, то берётся одна строка 57000,как и необходимо. Берётся большая сумма при пересечении дат.
Но мне необходимы значения ДатаНачала и ДатаКонца ! Если к ним в группировку добавить контрагента, то вылазят всё-равно две строки!!!
Пытался через вложеный запрос или пакет запросов,безуспешно.
Сейчас исходя из запроса в теме в итоге выходит две строки:
1) Соглассумма: 40000 ; ДатаНачала: 29.06.2020; ДатаКонца: 30.06.2020
2) Соглассумма: 57000 ; ДатаНачала: 30.06.2020; ДатаКонца: 02.07.2020
То есть максимум не отрабатывает!
Если же убрать ДатаНачала и ДатаКонца из группировки и добавить контрагента, то берётся одна строка 57000,как и необходимо. Берётся большая сумма при пересечении дат.
Но мне необходимы значения ДатаНачала и ДатаКонца ! Если к ним в группировку добавить контрагента, то вылазят всё-равно две строки!!!
Пытался через вложеный запрос или пакет запросов,безуспешно.
(6) То есть по значению суммы? А если куча одинаковых сумм.
1) В первом подзапросе отгруппировать по контрагенту и получить максмум сумму(поместить в вт)
2) Во втором итоговом подзапросе связать вт с этим же регистром по контрагенту и получить даты
так имеете ввиду ?
1) В первом подзапросе отгруппировать по контрагенту и получить максмум сумму(поместить в вт)
2) Во втором итоговом подзапросе связать вт с этим же регистром по контрагенту и получить даты
так имеете ввиду ?
(9) По приведенному в вопросе тексту запроса нет необходимости связывать. Просто берете полученное значение из вложенного запроса. Вложенный запрос - с суммированием, но без группировок:
ВЫБРАТЬ
МАКСИМУМ(ЛадСогласСуммаСрезПоследних.Сумма) КАК МаксСумма
ИЗ
РегистрСведений.ЛадСогласСумма.СрезПоследних(
&ДатаНачала,
Контрагент = &Контрагент
И (&ДатаОкончания <= ДатаОкончанияДействия
ИЛИ ДатаОкончанияДействия = ДАТАВРЕМЯ(1, 1, 1))) КАК ЛадСогласСуммаСрезПоследних
Показать
(20) Требуется подробное разжевывание? Извольте.
ВЫБРАТЬ
ЛадСогласСуммаСрезПоследних.Период КАК ДатаНачала,
ЛадСогласСуммаСрезПоследних.ДатаОкончанияДействия КАК ДатаКонца,
ПоискМаксимума.МаксСумма КАК СогласСумма
ИЗ
(ВЫБРАТЬ
МАКСИМУМ(ЛадСогласСуммаСрезПоследних.Сумма) КАК МаксСумма
ИЗ
РегистрСведений.ЛадСогласСумма.СрезПоследних(
&ДатаНачала,
Контрагент = &Контрагент
И (&ДатаОкончания <= ДатаОкончанияДействия
ИЛИ ДатаОкончанияДействия = ДАТАВРЕМЯ(1, 1, 1))) КАК ЛадСогласСуммаСрезПоследних) КАК ПоискМаксимума
ЛЕВОЕ СОЕДИНЕНИЕ
РегистрСведений.ЛадСогласСумма.СрезПоследних(
&ДатаНачала,
Контрагент = &Контрагент
И (&ДатаОкончания <= ДатаОкончанияДействия
ИЛИ ДатаОкончанияДействия = ДАТАВРЕМЯ(1, 1, 1))) КАК ЛадСогласСуммаСрезПоследних
ПО ЛадСогласСуммаСрезПоследних.Сумма = ПоискМаксимума.МаксСумма
Показать
(13)Под руками была только 1.6 для беларуси. Выводит макс число на макс дату. периоды можете сами подставить и посмотреть что получилось. таблица услуги.
Если убрать второй вложеный запрос выведет по несколько дат в периоде с макс суммой.
ВЫБРАТЬ
МАКСИМУМ(РеализацияТоваровУслугУслуги.Ссылка.Дата) КАК Дата,
РеализацияТоваровУслугУслуги.Ссылка.Контрагент КАК Контрагент,
МАКСИМУМ(РеализацияТоваровУслугУслуги.Сумма) КАК Сумма
ИЗ
Документ.РеализацияТоваровУслуг.Услуги КАК РеализацияТоваровУслугУслуги
ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
МАКСИМУМ(РеализацияТоваровУслугУслуги.Ссылка.Дата) КАК Дата,
РеализацияТоваровУслугУслуги.Ссылка.Контрагент КАК Контрагент,
МАКСИМУМ(РеализацияТоваровУслугУслуги.Сумма) КАК Сумма
ИЗ
Документ.РеализацияТоваровУслуг.Услуги КАК РеализацияТоваровУслугУслуги
ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
РеализацияТоваровУслугУслуги.Ссылка.Контрагент КАК Контрагент,
МАКСИМУМ(РеализацияТоваровУслугУслуги.Сумма) КАК Сумма
ИЗ
Документ.РеализацияТоваровУслуг.Услуги КАК РеализацияТоваровУслугУслуги
СГРУППИРОВАТЬ ПО
РеализацияТоваровУслугУслуги.Ссылка.Контрагент) КАК ВложенныйЗапрос
ПО РеализацияТоваровУслугУслуги.Ссылка.Контрагент = ВложенныйЗапрос.Контрагент
И РеализацияТоваровУслугУслуги.Сумма = ВложенныйЗапрос.Сумма
СГРУППИРОВАТЬ ПО
РеализацияТоваровУслугУслуги.Ссылка.Контрагент) КАК ВложенныйЗапрос
ПО РеализацияТоваровУслугУслуги.Ссылка.Контрагент = ВложенныйЗапрос.Контрагент
И РеализацияТоваровУслугУслуги.Сумма = ВложенныйЗапрос.Сумма
СГРУППИРОВАТЬ ПО
РеализацияТоваровУслугУслуги.Ссылка.Контрагент
УПОРЯДОЧИТЬ ПО
Контрагент
ПоказатьЕсли убрать второй вложеный запрос выведет по несколько дат в периоде с макс суммой.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот