Написать сложный SQL запрос на расчет себестоимости продаж по FIFO

4 000 руб. за проект
08 февраля 2021, 17:17 • 9 откликов • 52 просмотра
Небольшое введение
Мы имеем дело с системой управления торговлей МойСклад (упрощенная 1С). Все операции в этой системе фиксируются документами (продажа, отгрузка, приемка, перемещение, списание и др.). В каждом документе есть список товаров. Мы выгрузили данные документов по API, но себестоимость товаров получить по API мы не можем (точнее можем, но не для всех документов). Себестоимость товаров есть только у документов Приемки, на основе которых и нужно посчитать себестоимость других документов (продаж, отгрузок и др.).

Ссылка на видео с пояснением и описанием принципа расчета себестоимости:
https://www.loom.com/share/e15a7e1c97eb4ed78c1ca0e...

Тезисы из видео
Данные документов хранятся в 2 таблицах:
1. Список документов (продажа, отгрузка, приемка и др.). Все необходимые документы, влияющие на остаток товара и на себестоимость. В таблице указан тип документа и Id документа.
2. Список товаров по конкретным документам. Связывается по id документа со списком документов.

Результатом запроса должна стать таблица, в которой для каждого товара из 2 таблицы посчитана себестоимость.

Как считается себестоимость (или в чем сложность)
1. Поступление товара на склад фиксируется документом Приемка, только в Приемке указана себестоимость. Казалось бы, можно просто взять приемки товаров, посмотреть, какая там себест. и сделать join.
2. НО себестоимость считается по принципу FIFO (первым пришел - первым ушел). Один товар может лежать на складе с разной себестоимостью, т.к. мог поступить на склад разными документами Приемки. И когда осуществляется, например, Продажа, товар уходит с той себестоимостью, которая указана в более ранней приемке. Когда товар из 1st приемки будет распродан, себестоимость будет браться из 2 приемки.
3. Есть еще такая сложность. Себестоимость нужно получить также по документам возврата, в них себестоимость берется из документа Продажа, но в документе Продажи изначально нет себестоимости, ее тоже нужно посчитать.