Я хотел бы рассчитать, какие заказы могут быть выполнены и какие даты отсутствуют (diff) после выполнения как можно большего количества заказов на данный момент. Выбирается в порядке FEFO.
Размышляя о проблеме, я думаю, что некоторая текущая сумма, основанная как на датах акций, так и на заказах, была бы одним из способов. Основываясь на Расчет текущего общего/текущего баланса и других подобных потоках, кажется, что это хорошо подходит для проблемы, но я открыты для других решений.
Пример кода
DECLARE @stockTable TABLE (
BATCH_NUM nvarchar(16),
QUANTITY int,
DATE_OUTGO DATE
)
DECLARE @orderTable TABLE (
ORDER_ID int,
QUANTITY int,
DATE_OUTGO DATE
)
INSERT INTO @stockTable (BATCH_NUM, QUANTITY, DATE_OUTGO)
VALUES
('1000', 10, '2017-08-25'),
('1001', 20, '2017-08-26'),
('1002', 10, '2017-08-27')
INSERT INTO @orderTable (ORDER_ID, QUANTITY, DATE_OUTGO)
VALUES
(1, 10, '2017-08-25'),
(1, 12, '2017-08-25'),
(2, 10, '2017-08-26'),
(3, 10, '2017-08-26'),
(4, 16, '2017-08-26')
SELECT
DATE_OUTGO,
SUM(RunningTotal) AS DIFF
FROM (
SELECT
orderTable.DATE_OUTGO AS DATE_OUTGO,
RunningTotal = SUM(stockTable.QUANTITY - orderTable.QUANTITY ) OVER
(ORDER BY stockTable.DATE_OUTGO ROWS UNBOUNDED PRECEDING)
FROM
@orderTable orderTable
INNER JOIN @stockTable stockTable
ON stockTable.DATE_OUTGO >= orderTable.DATE_OUTGO
GROUP BY
orderTable.DATE_OUTGO,
stockTable.DATE_OUTGO,
stockTable.QUANTITY,
orderTable.QUANTITY
) A
GROUP BY DATE_OUTGO
Результаты
The correct result would look like this.
-------------------------
| OT_DATE_OUTGO | DIFF |
-------------------------
| 2017-08-25 | 0 |
-------------------------
| 2017-08-26 | -18 |
-------------------------
My result currently looks like this.
-------------------------
| OT_DATE_OUTGO | DIFF |
-------------------------
| 2017-08-25 | 80 |
-------------------------
| 2017-08-26 | 106 |
-------------------------
Я убрал такие сложности, как номера позиций, одновременное выполнение различных требований (используя только точную дату и дату или лучше) и т. д., чтобы максимально упростить основную проблему.
Редактировать 1:
Обновлены строки как в таблицах, так и в результатах (правильные и с исходным запросом). Первый ответ дал разницу -12 на 25 августа 2017 г. вместо 0. Но 26 августа 2017 г. был правильным.