Форум на Kuban.ru (http://forums.kuban.ru/)
-   Территория 1С (http://forums.kuban.ru/f1040/)
-   -   Агрегатная функция в запросе к регистру сведений (http://forums.kuban.ru/f1040/agregatnaya_funkciya_v_zaprose_k_registru_svedenij-5729169.html)

roofus_leo 21.05.2014 13:32

Агрегатная функция в запросе к регистру сведений
 
Всем привет!
Подскажите, плиз, есть ли вариант в запросе вытащить МАКСИМУМ по ценам из регистра сведений приведя их к единой валюте?
База УТ 10.3.

roma n 21.05.2014 13:45

Не вижу препятствий. Что не получается-то?

Jimbo 21.05.2014 13:50

афтар не договаривает максимум чего - по номенклактуре и/или типу цен, дате ?

roofus_leo 23.05.2014 17:56

В запросе есть валюта (ссылка)
Нужно в запросе сначала взять произведение курса валюты и цены, а потом взять максимум. Как лучше это сделать?

bma1 23.05.2014 19:24

Я бы делал пакетным запросом...

Reaper 23.05.2014 21:07

Нужно просто взять яйца в кулак и сделать работу.

roofus_leo 03.06.2014 18:56

Еще раз добрый день!
Так задачу и недомучал :(
Вот запрос ткните носом что не так
ВЫБРАТЬ
НовыеЦены.Номенклатура,
НовыеЦены.ЦенаРуб,
НовыеЦены.Цена,
НовыеЦены.Валюта
ИЗ
(ВЫБРАТЬ
НовыеЦены.Номенклатура КАК Номенклатура,
МАКСИМУМ(НовыеЦены.Цена * Курсы.Курс) КАК ЦенаРуб,
НовыеЦены.Цена КАК Цена,
НовыеЦены.Валюта КАК Валюта
ИЗ
РегистрСведений.мегапрайсЦеныНоменклатурыПоставщиков.СрезПоследних КАК НовыеЦены
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних КАК Курсы
ПО НовыеЦены.Валюта = Курсы.Валюта
ГДЕ
НовыеЦены.Номенклатура В ИЕРАРХИИ(&Номенклатура)

СГРУППИРОВАТЬ ПО
НовыеЦены.Номенклатура,
НовыеЦены.Цена,
НовыеЦены.Валюта) КАК НовыеЦены

СГРУППИРОВАТЬ ПО
НовыеЦены.Номенклатура,
НовыеЦены.ЦенаРуб,
НовыеЦены.Цена,
НовыеЦены.Валюта

roofus_leo 03.06.2014 18:59

Собственно задача состоит в том, что нужно выбрать максимальные цены по номенклатуре с приведением их к единой валюте. Т.к. храняться они и в рублях и в у.е.
А в результате выдать цену и валюту в которой она храниться.
Этот результат дальше будет присоединяться к другом запросе к другим данным.

Reaper 03.06.2014 21:21

* Вложенный запрос - сразу в топку. Запрос должен быть пакетным.
* Схема запроса:
1. Выбрать в отдельную таблицу список номенклатуры, которая интересует пользователя. Именно здесь наложить все фильтры.
2. Выбрать данные о ценах из виртуальной таблицы "срез последних" регистра "ЦеныНоменклатуры" с использованием параметров виртуальной таблицы для отбора цен по номенклатуре из п.1.
3. Соединить результат п.2 с реальной таблицей регистра "КурсыВалют" по полю период с условием "Цена.Период > КурсыВалют.Период И Цена.Валюта = КурсыВалют.Валюта". К полю "КурсыВалют.Период" применить агрегатную функцию "Максимум". В результате получится таблица, аналогичная п.2, но с дополнительной колонкой, в которой будет содержаться дата курса валюты, действительного для каждой цены.
4. Результат п.3 снова соединяем с реальной таблицей курсов валют по дате курса валюты и самой валюте. В результате должна получиться таблица с данными как о ценах, так и о курсах, действительных для этих цен. Здесь уже можно сделать пересчет в нужную валюту. Только не забудьте хотя бы про кратность валюты.

roofus_leo 04.06.2014 02:32

Наверное невнятно поставил задачу.
Еще раз что нужно:
Есть куча прайсов от поставщиков, они обновляются почти каждый день. Храняться в регистре сведений РегистрСведений.мегапрайсЦеныНоменклатурыПоставщиков.
Нужно на текущий момент времени:
1. Создать таблицу с ценами по списку номенклатуры.
2. Привести их к единой валюте по курсу на текущий момент. Т.е. получить цену в рублях. Если цена уже в рублях. Она таковой и остается.
3. Выбрать максимальную цену в разрезе номенклатуры.
4. Из получившегося результата вывести таблицу с полями Номенклатура, Цена (само значение в регистре), валюта в которой хранится цена.
Вот собственно и все.
В принципе, конечно, нужно еще наложить условия по поставщикам (фильтр) и по периоду цен, но это уже дальше. Сейчас результат запроса выдает максимум по двум разрезам сразу и по цене и по цене в рублях. Как получить максимальную цену в рублях а в таблицу вставить в валюте? вот в чем вопрос.

roma n 04.06.2014 08:19

9-roofus_leo >
1) получить исходную таблицу в виде Номенклатура-Валюта-Цена - ЦенаRUR. Положить во временную
2) сгруппировать Max(ЦенаRUR)по Номенклатуре
3) К полученной сагрегированной слева прицепить сохранённую в 1) по Номенклатура и ЦенаRUR

roofus_leo 04.06.2014 12:38

Вот что в итоге получилось
Выдает вроде то, что нужно.
Просто как-то коряво написал :(
+ Code
ВЫБРАТЬ
МаксЦеныРуб.Номенклатура КАК Номенклатура,
МаксЦеныРуб.Поле1,
ИсхТабл.Цена,
ИсхТабл.Валюта
ИЗ
(ВЫБРАТЬ
Цены.Номенклатура КАК Номенклатура,
МАКСИМУМ(Курсы.Курс * Цены.Цена) КАК Поле1
ИЗ
РегистрСведений.мегапрайсЦеныНоменклатурыПоставщиков.СрезПоследних(, ) КАК Цены
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних КАК Курсы
ПО Цены.Валюта = Курсы.Валюта
ГДЕ
Цены.Номенклатура В ИЕРАРХИИ(&Номенклатура)
И Цены.ПрайсПартнера.Партнер В ИЕРАРХИИ(&Партнер)
И Цены.Регистратор.Дата >= &НачПериод

СГРУППИРОВАТЬ ПО
Цены.Номенклатура) КАК МаксЦеныРуб
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
мегапрайсЦеныНоменклатурыПоставщиковСрезПоследних.Номенклатура КАК Номенклатура,
мегапрайсЦеныНоменклатурыПоставщиковСрезПоследних.Цена * КурсыВалютСрезПоследних.Курс КАК Поле1,
мегапрайсЦеныНоменклатурыПоставщиковСрезПоследних.Цена КАК Цена,
мегапрайсЦеныНоменклатурыПоставщиковСрезПоследних.Валюта КАК Валюта
ИЗ
РегистрСведений.мегапрайсЦеныНоменклатурыПоставщиков.СрезПоследних КАК мегапрайсЦеныНоменклатурыПоставщиковСрезПоследних
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних КАК КурсыВалютСрезПоследних
ПО мегапрайсЦеныНоменклатурыПоставщиковСрезПоследних.Валюта = КурсыВалютСрезПоследних.Валюта
ГДЕ
мегапрайсЦеныНоменклатурыПоставщиковСрезПоследних.Номенклатура В ИЕРАРХИИ(&Номенклатура)
И мегапрайсЦеныНоменклатурыПоставщиковСрезПоследних.ПрайсПартнера.Партнер В ИЕРАРХИИ(&Партнер)
И мегапрайсЦеныНоменклатурыПоставщиковСрезПоследних.Регистратор.Дата >= &НачПериод) КАК ИсхТабл
ПО МаксЦеныРуб.Номенклатура = ИсхТабл.Номенклатура
И МаксЦеныРуб.Поле1 = ИсхТабл.Поле1

УПОРЯДОЧИТЬ ПО
Номенклатура


Текущее время: 13:54. Часовой пояс GMT +3.