Ich habe SQL Server nicht zur Hand und SQLFiddle spielt in letzter Zeit nicht gut mit mir, also ist dies ungetestet, aber die Logik sollte funktionieren ...
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
Kehren Sie zuerst Ihre Bestellmengen ins Negative um, damit sie der Betrag sind, um den sich die Lagerbestände ändern werden.
Vereinen Sie als Nächstes Ihre Lagerbestände mit den Bestellungen, mit einer erforderlichen Zeit von 0 (um es ein bisschen wie eine Bestellung zu machen, die Lager liefert, anstatt Bestand zu nehmen, und vor allen Ihren anderen Bestellungen kommt) .
Berechnen Sie als Nächstes, wie hoch die verbleibende Gesamtmenge eines Produkts nach einer Bestellung ist. indem alle vorhergehenden Zeilen (in zeitlicher Reihenfolge) für dieses Produkt summiert werden. (Gib Stock - Order1 - Order2, etc, etc
)
Wählen Sie dann die Zeilen aus, in denen der neue Lagerbestand negativ geworden ist.