Heim >Datenbank >MySQL-Tutorial >Wie kann die gepoolte Losmenge mithilfe von SQL Recursive CTE reduziert werden?

Wie kann die gepoolte Losmenge mithilfe von SQL Recursive CTE reduziert werden?

DDD
DDDOriginal
2025-01-10 11:46:42430Durchsuche

How to Reduce Pooled Lot Quantity Using SQL Recursive CTE?

Verwendung des rekursiven SQL-CTE zum Dekrementieren gepoolter Losmengen

Diese SQL Server 2005-Lösung verwendet einen rekursiven Common Table Expression (CTE), um gepoolte Losmengen basierend auf Verbrauchsdaten iterativ zu reduzieren. Der Prozess bewältigt effizient Szenarien, in denen der Verbrauch die verfügbare Menge über mehrere Chargen innerhalb eines Pools hinweg übersteigt.

Hier ist der SQL-Code:

<code class="language-sql">-- Sample data setup
DECLARE @Pooled_Lots AS TABLE (
  Id INT,
  Pool INT,
  Lot INT,
  Quantity INT
);

INSERT INTO @Pooled_Lots (Id, Pool, Lot, Quantity) VALUES
(1, 1, 1, 5),
(2, 1, 2, 10),
(3, 1, 3, 4),
(4, 2, 1, 7),
(5, 3, 1, 1),
(6, 3, 2, 5);

DECLARE @Pool_Consumption AS TABLE (
  Id INT,
  PoolId INT,
  QuantityConsumed INT
);

INSERT INTO @Pool_Consumption (Id, PoolId, QuantityConsumed) VALUES
(1, 1, 17),
(2, 2, 8),
(3, 3, 10);


-- Recursive CTE to calculate remaining quantities
WITH LotQuantities AS (
    SELECT 
        PL.Pool, 
        PL.Lot, 
        PL.Quantity, 
        PC.QuantityConsumed,
        PL.Quantity as RunningQuantity,
        PC.QuantityConsumed as RemainingDemand,
        CASE WHEN PL.Quantity >= PC.QuantityConsumed THEN 0 ELSE PC.QuantityConsumed - PL.Quantity END as SurplusOrDeficit
    FROM @Pooled_Lots PL
    LEFT JOIN @Pool_Consumption PC ON PL.Pool = PC.PoolId
    WHERE PL.Lot = 1 -- Start with the first lot in each pool

    UNION ALL

    SELECT 
        lq.Pool, 
        PL.Lot, 
        PL.Quantity, 
        lq.QuantityConsumed,
        CASE WHEN lq.RemainingDemand > PL.Quantity THEN lq.RunningQuantity + PL.Quantity ELSE lq.QuantityConsumed END,
        CASE WHEN lq.RemainingDemand > PL.Quantity THEN lq.RemainingDemand - PL.Quantity ELSE 0 END,
        CASE WHEN lq.RemainingDemand > PL.Quantity THEN 0 ELSE lq.RemainingDemand - (lq.RunningQuantity + PL.Quantity) END
    FROM LotQuantities lq
    JOIN @Pooled_Lots PL ON lq.Pool = PL.Pool AND PL.Lot = lq.Lot + 1
    WHERE lq.RemainingDemand > 0
)
SELECT * FROM LotQuantities;</code>

Der resultierende Datensatz zeigt die verbleibende Menge für jede Charge nach dem Verbrauchsabzug. Der CTE verarbeitet die Chargen innerhalb jedes Pools rekursiv, bis die verbrauchte Menge vollständig berücksichtigt ist. Beachten Sie, dass negative Werte in SurplusOrDeficit auf ein Defizit hinweisen.

Das obige ist der detaillierte Inhalt vonWie kann die gepoolte Losmenge mithilfe von SQL Recursive CTE reduziert werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn