No tengo SQL Server a mano y SQLFiddle no me está funcionando bien últimamente, por lo que no se ha probado, pero la lógica debería funcionar...
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
Primero invierta las cantidades de su pedido para que sean negativas, de modo que sean la cantidad por la que cambiarán los niveles de existencias.
A continuación, una los niveles de existencias a los pedidos, con un tiempo requerido de 0 (para que sea un poco como una orden que entrega existencias en lugar de tomar existencias, y viene antes que todas sus otras órdenes) .
Luego, calcule cuál es la cantidad total restante de un producto después de un pedido; sumando todas las filas anteriores (en orden de tiempo) para ese producto. (Dando Stock - Order1 - Order2, etc, etc
)
A continuación, seleccione las filas en las que el nuevo nivel de existencias se haya vuelto negativo.