Рассчитать различные накопленные расходы на хранение с течением времени? - PullRequest
0 голосов
/ 15 октября 2019

Я работаю над проектом для импортера вина, в котором необходимо рассчитать накопленные расходы на хранение по SKU до даты поставки.

У меня есть данные со склада, записывающие Date_In и Date_Out, поэтому вычисление DATEDIFF('day', Date_In, Date_Out) довольно тривиально. Однако каждый год склад меняет свои цены, поэтому при расчете затрат на хранение мне нужно разделить мои Days_in_Stock по разным ставкам.

Входные данные с датами движения запасов:

+----------------+------------+---------+-----+------------+------------+
| INVOICE_NUMBER | STOCK_CODE | CS_SIZE | QTY |  DATE_IN   |  DATE_OUT  |
+----------------+------------+---------+-----+------------+------------+
|           1001 | MP-BMB13   |       6 |   1 | 2019-03-01 | 2019-06-01 |
|           1002 | MP-BMB13   |       6 |   1 | 2019-03-01 | 2019-10-01 |
+----------------+------------+---------+-----+------------+------------+

Хранениеставки:

+----------------+-----------+-------------+
| DATE_EFFECTIVE | CASE_SIZE | COST_PER_WK |
+----------------+-----------+-------------+
| 2018-09-01     |         9 |      0.1375 |
| 2018-09-01     |         6 |     0.06875 |
| 2019-09-01     |         9 |      0.1425 |
| 2010-09-01     |         6 |     0.07125 |
+----------------+-----------+-------------+

Мой желаемый результат следующий:

+----------------+------------+---------------+--------------+
| INVOICE_NUMBER | STOCK_CODE | DAYS_IN_STOCK | STORAGE_COST |
+----------------+------------+---------------+--------------+
|           1001 | MP-BMB13   |            92 |         0.90 |
|           1002 | MP-BMB13   |           214 |         2.10 |
+----------------+------------+---------------+--------------+

DAYS_IN_STOCK рассчитывается с DATEDIFF('day', Date_In, Date_Out)

STORAGE_COST равно COST_PER_WK * DAYS_IN_STOCK / 7

Проблема, с которой я столкнулся, заключается в том, что, как и в случае со Счетом 1002, DAYS_IN_STOCK охватывает более одного уровня оплаты. В этом случае вычисление должно быть примерно таким:

COST_PER_WK (before 2019-09-01)* DAYS_IN_STOCK (before 2019-09-01) / 7
+ 
COST_PER_WK (since 2019-09-01)* DAYS_IN_STOCK (since 2019-09-01) / 7

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

Подходы, предпринятые до сих пор:

  • Жесткое кодирование запроса для определения количества дней до и после изменения скорости, но мне в конечном итоге потребуется использовать данные за 5 лет и реализовать то же самое длягораздо более сложная таблица тарифов доставки.
  • Пытался присоединиться Date_In к Date_Effective, но я не мог заставить его работать, и понятия не имею, как мне расширить до 3 тарифов.

Я довольно озадачен тем, как решить эту проблему, поэтому любые идеи будут очень кстати. В настоящее время используется SQL Server 2017

1 Ответ

0 голосов
/ 15 октября 2019

Это должно дать вам представление о том, как решить эту проблему. Я не хочу иметь дело с неделями, поэтому я напишу этот ответ в виде дней.

Основная идея состоит в том, чтобы добавить дату окончания в таблицу ставок, затем использовать join и агрегацию:

with sr as (
      select r.*,
             lead(date_effective) over (partition by case_size) as date_end,
             cost_per_wk / 7.0 as cost_per_day
      from storage_rates r
     )
select i.*, sr.total_cost
from invoices i outer apply
     (select sum(datediff(day,
                          (case when i.date_in > sr.date_effective then i.date_in else sr.date_effective end),
                          (case when i.date_out < sr.date_eend then i.date_out else sr.date_end end)
                         ) * sr.cost_per_day
                 ) as total_cost
      from sr
      where i.cs_size = sr.cs_size and  -- I think the case size is relevant
            i.date_in < sr.date_end and
            i.date_out >= sr.date_effective
     ) sr;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...