手元にあるSQLServerがなく、SQLFiddleが最近うまく機能していないため、これはテストされていませんが、ロジックは機能するはずです...
WITH
stock_changes
AS
(
SELECT Supplier, Destination, Req_Time, Prd_Code, Prd_Description, -Qty AS Qty FROM orders
UNION ALL
SELECT Supplier, NULL, '00:00', Prd_Code, Prd_Desc, Stock FROM stock
),
stock_post_order
AS
(
SELECT
*,
SUM(Qty) OVER (PARTITION BY Supplier, Prd_Code
ORDER BY Req_Time
ROWS UNBOUNDED PRECEDING
)
AS new_qty
FROM
stock_changes
)
SELECT
*,
CASE WHEN new_qty > qty THEN new_qty ELSE qty END AS order_shortfall
FROM
stock_post_order
WHERE
new_qty < 0
まず、注文数量を負に反転します。これにより、在庫レベルが変化する量になります。
次に、必要な時間を0 にして、在庫レベルを注文に結合します(在庫を取得するのではなく、在庫を配達する注文のように、他のすべての注文よりも前に来るようにします) 。
次に、注文後の製品の残りの合計数量を計算します。その製品の前のすべての行を(時間順に)合計します。 (Stock - Order1 - Order2, etc, etc
)
次に、新しい在庫レベルがマイナスになった行を選択します。