Eu não tenho o SQL Server à mão e o SQLFiddle não está jogando bem comigo ultimamente, então isso não foi testado, mas a lógica deve 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
Primeiro, inverta as quantidades do seu pedido para que sejam negativas, para que elas sejam a quantidade pela qual os níveis de estoque serão alterados.
Em seguida, junte seus níveis de estoque aos pedidos, com um tempo necessário de 0 (para torná-lo um pouco como um pedido que entrega o estoque em vez de fazer o estoque e chegar antes de todos os outros pedidos) .
Em seguida, descubra qual é a quantidade total restante de um produto após um pedido; somando todas as linhas anteriores (em ordem de tempo) para esse produto. (Fornecendo
Stock - Order1 - Order2, etc, etc
) Em seguida, selecione as linhas em que o novo nível de estoque ficou negativo.