Я работаю над проектом для импортера вина, в котором необходимо рассчитать накопленные расходы на хранение по 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