Non ho SQL Server a portata di mano e SQLFiddle non funziona bene con me ultimamente, quindi non è stato testato, ma la logica dovrebbe funzionare...
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
Innanzitutto inverti le quantità dell'ordine in modo che siano negative, quindi sono l'importo di cui cambieranno i livelli delle scorte.
Quindi, unisci i livelli delle tue scorte agli ordini, con un tempo richiesto di 0 (per renderlo un po' come un ordine che fornisce scorte anziché fare scorte e precedere tutti gli altri tuoi ordini) .
Quindi, calcola qual è la quantità rimanente totale di un prodotto dopo un ordine; sommando tutte le righe precedenti (in ordine temporale) per quel prodotto. (Dare Stock - Order1 - Order2, etc, etc
)
Quindi seleziona le righe in cui il nuovo livello delle azioni è diventato negativo.