Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

SQL Confronta gli ordini totali orari e rimuovi le scorte correnti Possibile?

Non ho SQL Server a portata di mano e SQLFiddle non funziona bene con me ultimamente, quindi non è stato testato, ma la logica dovrebbe funzionare...

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

Innanzitutto inverti le quantità dell'ordine in modo che siano negative, quindi sono l'importo di cui cambieranno i livelli delle scorte.

Quindi, unisci i livelli delle tue scorte agli ordini, con un tempo richiesto di 0 (per renderlo un po' come un ordine che fornisce scorte anziché fare scorte e precedere tutti gli altri tuoi ordini) .

Quindi, calcola qual è la quantità rimanente totale di un prodotto dopo un ordine; sommando tutte le righe precedenti (in ordine temporale) per quel prodotto. (Dare Stock - Order1 - Order2, etc, etc )

Quindi seleziona le righe in cui il nuovo livello delle azioni è diventato negativo.