Jag har inte SQL Server till hands och SQLFiddle har inte spelat bra med mig på sistone, så det här är oprövat, men logiken borde fungera...
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
Invertera först dina beställningskvantiteter till att vara negativa, så att de är det belopp som lagernivåerna kommer att ändras med.
Förena sedan dina lagernivåer till beställningarna, med en nödvändig tid på 0 (för att göra det lite som en beställning som levererar lager snarare än tar lager, och kommer före alla dina andra beställningar) .
Räkna sedan ut vad den totala återstående kvantiteten av en produkt är efter en beställning; genom att summera alla föregående rader (i tidsordning) för den produkten. (Ge Stock - Order1 - Order2, etc, etc
)
Välj sedan de rader där den nya lagernivån har blivit negativ.