Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL Stündliche Gesamtbestellungen vergleichen und aktuellen Bestand entfernen möglich?

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.