Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
15 мая 2024, 22:31

запрос с таб. частями

Автор andron81_81, 23 сен 2018, 18:48

0 Пользователей и 1 гость просматривают эту тему.

andron81_81

Всем добрый день.

Можно ли решить грубо - говоря одним "SQL запросом" такую задачу ?
Есть справочник "Прайс" . Там одна табчасть "Цены".
в табчасти только 2 поля "Материал" и "цена".
Скажем в справочник вбито 3 прайса "Прайс0" , "Прайс1" и "Прайс2".
Например так :
Прайс0 в таб. часте вот такая картина :
Материал1 220руб.
Материал2 330руб.
Материал3 100руб.
Материал4 60руб.
Материал5 19900руб.


Прайс1 в таб. часте вот такая картина :
Материал1 220руб.
Материал2 330руб.
Материал3 100руб.

Прайс2 в таб. часте вот такая картина :
Материал1 1000руб.
Материал2 1330руб.

Необходимо вывести результирующий прайс по всем материалам с учетом этих всех этих прайсов. По такому принципу: сначала собираем все материалы по более позднему прайсу(более поздний можно ориентироваться по коду, скажем прайс1 имеет код 001 , а прайс2 002, прайс0 - 000. прайс2 считаем самый поздний в силу того , что код 002). А материалов которых нет в "Прайс2" мы возьмем в более раннем "Прайс1". Аналогично тех материалов которых нет в "прайс2" и в "прайс1" мы возьмем в "прайс0".

В результате результирующий прайс будет такой :

1. Материал1 1000руб.
2. Материал2 1330руб.
3. Материал3 100руб.
4. Материал4 60руб.
5. Материал5 19900руб.

строки 1, 2 взяты из Прайс2
строка 3 взята из прайс1
строка 4 и 5 взята из прайс0

Возможно задача не для одного запроса SQL запроса. Тогда может кто подскажет как решить вообще такую задачу ?




crisalis

Возможно, посмотри итоги в запросе и обход результата запроса по группировкам...

Отправлено с моего Redmi Note 3 через Tapatalk


crisalis

А и группировка в запросе...

Отправлено с моего Redmi Note 3 через Tapatalk


LexaK

вот один из вариантов, как получить цену из справочника с максимальным кодом, метод двух левых соединений позволяет выбирать крайние значения во многих задачах миную построение временных таблиц, если разберетесь в примере, легко решите свою (и другие) задачи


//эмуляция справочников, прайс1
Выбрать "Мат1" как Товар, 220 как Цена, "Прайс1" как Прайс поместить Прайсы
объединить все Выбрать "Мат2", 330, "Прайс1"
объединить все Выбрать "Мат3", 100, "Прайс1"
объединить все Выбрать "Мат4", 60, "Прайс1"
объединить все Выбрать "Мат5", 1990, "Прайс1"
//прайс2
объединить все Выбрать "Мат1", 220, "Прайс2"
объединить все Выбрать "Мат2", 330, "Прайс2"
объединить все Выбрать "Мат3", 100, "Прайс2"
//прайс3
объединить все Выбрать "Мат1", 1000, "Прайс3"
объединить все Выбрать "Мат2", 1330, "Прайс3"
;

//справочник Товары
Выбрать различные
Товар Поместить Товары из Прайсы
;
//результирующий запрос
Выбрать
Тов.Товар,
Пр0.Цена,
Пр0.Прайс //он же Код, для наглядности
из
Товары Тов
левое соединение Прайсы пр0
по Тов.Товар = Пр0.Товар

левое соединение Прайсы пр1
по Пр1.Товар = Пр0.Товар
и Пр1.Прайс > Пр0.Прайс
Где
Пр1.Прайс Есть Null
Упорядочить по
1
если помогло нажмите: Спасибо!

andron81_81

Цитата: LexaK от 23 сен 2018, 22:01
вот один из вариантов, как получить цену из справочника с максимальным кодом, метод двух левых соединений позволяет выбирать крайние значения во многих задачах миную построение временных таблиц, если разберетесь в примере, легко решите свою (и другие) задачи


//эмуляция справочников, прайс1
Выбрать "Мат1" как Товар, 220 как Цена, "Прайс1" как Прайс поместить Прайсы
объединить все Выбрать "Мат2", 330, "Прайс1"
объединить все Выбрать "Мат3", 100, "Прайс1"
объединить все Выбрать "Мат4", 60, "Прайс1"
объединить все Выбрать "Мат5", 1990, "Прайс1"
//прайс2
объединить все Выбрать "Мат1", 220, "Прайс2"
объединить все Выбрать "Мат2", 330, "Прайс2"
объединить все Выбрать "Мат3", 100, "Прайс2"
//прайс3
объединить все Выбрать "Мат1", 1000, "Прайс3"
объединить все Выбрать "Мат2", 1330, "Прайс3"
;

//справочник Товары
Выбрать различные
Товар Поместить Товары из Прайсы
;
//результирующий запрос
Выбрать
Тов.Товар,
Пр0.Цена,
Пр0.Прайс //он же Код, для наглядности
из
Товары Тов
левое соединение Прайсы пр0
по Тов.Товар = Пр0.Товар

левое соединение Прайсы пр1
по Пр1.Товар = Пр0.Товар
и Пр1.Прайс > Пр0.Прайс
Где
Пр1.Прайс Есть Null
Упорядочить по
1


спасибо. я вроде бы нашёл способ попроще :


Выбрать максимум(ц.Код), м.Ссылка ПОМЕСТИТЬ  Прайсы
Из Справочник.БЗ_Материалы м 
левое соединение Справочник.БЗ_ЦеныНаМатериалы.ЦенаМатирала цнм по цнм.Материал=м.Ссылка
левое соединение Справочник.БЗ_ЦеныНаМатериалы ц по ц.Ссылка=цнм.Ссылка
сгруппировать по м.Ссылка;

выбрать цм.ссылка,п.Ссылка , ЦенаСтоимость, ЦенаСебестоимость
из Прайсы п
//левое соединение Справочник.БЗ_ЦеныНаМатериалы ц по ц.код=п.код
левое соединение Справочник.БЗ_ЦеныНаМатериалы.ЦенаМатирала цм по цм.Ссылка.код=п.код и цм.материал=п.Ссылка

ephes

А я бы сделал так, меньше соединений и код выполняет задание -
ВЫБРАТЬ МАКСИМУМ(ПрайсыЦены.Ссылка.Код) КАК Код, ПрайсыЦены.Материал КАК Материал
ПОМЕСТИТЬ Т1
ИЗ
Cправочник.Прайсы.Цены КАК ПрайсыЦены
        СГРУППИРОВАТЬ ПО
        ПрайсыЦены.Материал;
ВЫБРАТЬ Т1.Материал, ПрайсыЦены.Цена, Т1.Код
        ИЗ
      Т1 КАК Т1
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Прайсы.Цены КАК ПрайсыЦены
ПО Т1.Код = ПрайсыЦены.Ссылка.Код
И Т1.Материал = ПрайсыЦены.Материал

andron81_81

Цитата: ephes от 24 сен 2018, 10:05
А я бы сделал так, меньше соединений и код выполняет задание -
ВЫБРАТЬ МАКСИМУМ(ПрайсыЦены.Ссылка.Код) КАК Код, ПрайсыЦены.Материал КАК Материал
ПОМЕСТИТЬ Т1
ИЗ
Cправочник.Прайсы.Цены КАК ПрайсыЦены
        СГРУППИРОВАТЬ ПО
        ПрайсыЦены.Материал;
ВЫБРАТЬ Т1.Материал, ПрайсыЦены.Цена, Т1.Код
        ИЗ
      Т1 КАК Т1
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Прайсы.Цены КАК ПрайсыЦены
ПО Т1.Код = ПрайсыЦены.Ссылка.Код
И Т1.Материал = ПрайсыЦены.Материал


я вот это не догадывался , что можно так делать  , я все время джоинил по ссылке на сам объект от его табличной части .

ПрайсыЦены.Ссылка.Код


но не происходил ли при этом внутри джоин , если нет,  то мне придется кучу запросов переделывать для оптимизации.

LexaK

ну ладно если это как тестовая задача была!
а почему вы не используете периодический Регистр сведений для хранения цены? уж чего проще СрезПоследних использовать?
если помогло нажмите: Спасибо!

andron81_81

Цитата: LexaK от 24 сен 2018, 10:37
ну ладно если это как тестовая задача была!
а почему вы не используете периодический Регистр сведений для хранения цены? уж чего проще СрезПоследних использовать?

а потому что никто до Вас не подсказал, а я чайник :)

LexaK

э-э-э, возьмите какую нибудь базу (или сразу несколько) баз от большого брата (1С) там столько подсказок! многие вещи уже настолько отлажены что стали классикой/правилами и т.д. опять же колесо изобретать не придется.
если помогло нажмите: Спасибо!

Похожие темы (5)

Рейтинг@Mail.ru

Поиск