Есть регистр продаж и отдельная цена на дату продажи в регистре цен. Нужно сделать запрос, где бы строчка с продажей объединилась с нужной ценой (и потом сумма продажи пересчиталась по этой цене). Цена должна быть именно на дату продажи из строчки, а не заданной датой в настройке запроса.
(1) Можно так. На 1С данный запрос переводится.
По сути на каждую строку продажи прям берешь цену из таблицы цен. Прям как в формулировке задачи.
https://onecompiler.com/sqlite/438k59waa В начале данные, а сам запрос:
SEL ECT t1.*, (SELECT t.c fr om vt_price as t WHERE t1.p = t.p AND t1.d>=t.d ORDER by t.d DESC LIMIT 1 ) as cena
,t1.kol * (SELECT t.c fr om vt_price as t WH ERE t1.p = t.p AND t1.d>=t.d ORDER by t.d DESC LIM IT 1 ) as summa
FR OM vt_prodagi as t1
Остается только проверку на NULL добавить и усё. :-)
ВЫБРАТЬ
Продажи.Период КАК ДатаПродажи,
Продажи.Номенклатура КАК Номенклатура,
Продажи.Количество КАК Количество,
ЕСТЬNULL(Цены.Цена, 0) КАК Цена
ИЗ
РегистрНакопления.Продажи КАК Продажи
ЛЕВОЕ СОЕДИНЕНИЕ (
ВЫБРАТЬ
Цены.Номенклатура КАК Номенклатура,
Цены.Период КАК ДатаЦены,
Цены.Цена КАК Цена
ИЗ
РегистрСведений.Цены КАК Цены
) КАК Цены
ПО (Цены.Номенклатура = Продажи.Номенклатура)
И (Цены.ДатаЦены = (
ВЫБРАТЬ
МАКСИМУМ(ПодЦены.Период)
ИЗ
РегистрСведений.Цены КАК ПодЦены
ГДЕ
ПодЦены.Номенклатура = Продажи.Номенклатура
И ПодЦены.Период <= Продажи.Период
))
Если уточнить, то даёт сразу два результата....
Первый, что и выше, но это не единственный, можно не через максимум, а через первые 1 и сортировку.
Второй вариант с помощью оконной функции и опять мимо. :-)
Если чуть поправить, то выдает похожее не правду.
Ко всем вариантам дает пояснения и условия когда будет или не будет получен результат. Что учитывает и что не учитывает тот или иной вариант.
Если даже не знать правильный ответ, но внимательно читать пояснения и поправлять условия задачи, то можно быстро добиться требуемого результата в простых задачах.