Nie mam pod ręką serwera SQL Server, a SQLFiddle ostatnio nie gra dobrze ze mną, więc nie zostało to przetestowane, ale logika powinna działać...
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
Najpierw odwróć ilości zamówień na ujemne, tak aby były to ilości, o które zmienią się poziomy zapasów.
Następnie połącz poziomy zapasów z zamówieniami, z wymaganym czasem 0 (aby było trochę jak zamówienie, które dostarcza zapasy, a nie gromadzi zapasy i ma pierwszeństwo przed wszystkimi innymi zamówieniami) .
Następnie oblicz, jaka jest całkowita pozostała ilość produktu po zamówieniu; sumując wszystkie poprzednie wiersze (w kolejności czasowej) dla tego produktu. (Przekazywanie Stock - Order1 - Order2, etc, etc
)
Następnie wybierz wiersze, w których nowy poziom zapasów spadł.