Heim >Datenbank >MySQL-Tutorial >Wie kann ein rekursiver CTE Verbrauchsmaterialmengen auf gepoolte Chargen verteilen und verfolgen und dabei eine detaillierte Aufschlüsselung der verbleibenden und ausstehenden Mengen bereitstellen?
Verfolgen des Verbrauchsmaterialbestands über mehrere Chargen hinweg
Eine effiziente Bestandsverwaltung erfordert eine genaue Verfolgung der Verbrauchsmaterialmengen über gepoolte Chargen hinweg. Dies erfordert eine Abfrage, die den Verbrauch mehrerer Chargen anhand bestimmter Kriterien genau abzieht. Die vorgestellte Lösung nutzt dazu einen rekursiven Common Table Expression (CTE).
Rekursiver CTE-Ansatz:
Der Kern der Lösung ist ein rekursiver CTE mit dem cleveren Namen „Amos“, der gepoolte Lose durchläuft. Es beginnt mit der Initialisierung jedes Pools mit seinem ersten Los. Der CTE verarbeitet dann nachfolgende Chargen rekursiv und aktualisiert die verbrauchte Menge dynamisch.
Für jede Charge berechnet der CTE die RunningQuantity
(Restmenge) und RemainingDemand
(Ausstehende Menge) auf Grundlage des kumulierten Verbrauchs. Diese Werte werden dann verwendet, um die Berechnungen für nachfolgende Lose innerhalb desselben Pools zu unterstützen.
Ausgabedetails:
Der endgültige Ergebnissatz bietet eine umfassende Aufschlüsselung für jeden Pool und jedes Grundstück, einschließlich:
Beispielimplementierung:
Das folgende Beispiel demonstriert die Funktionalität der Abfrage anhand von Beispieldaten:
<code class="language-sql">-- Sample Data (Pooled Lots) DECLARE @Pooled_Lots 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); -- Sample Data (Pool Consumption) DECLARE @Pool_Consumption TABLE (Id INT, Pool INT, QuantityConsumed INT); INSERT INTO @Pool_Consumption (Id, Pool, QuantityConsumed) VALUES (1, 1, 17), (2, 2, 8), (3, 3, 10); -- Recursive CTE Query WITH Amos AS ( -- Anchor Member: Initialize with the first lot of each pool SELECT PL.Pool, PL.Lot, PL.Quantity, PC.QuantityConsumed, CASE WHEN PC.QuantityConsumed IS NULL THEN PL.Quantity WHEN PL.Quantity >= PC.QuantityConsumed THEN PL.Quantity - PC.QuantityConsumed ELSE 0 END AS RunningQuantity, CASE WHEN PC.QuantityConsumed IS NULL THEN 0 WHEN PL.Quantity >= PC.QuantityConsumed THEN 0 ELSE PC.QuantityConsumed - PL.Quantity END AS RemainingDemand FROM @Pooled_Lots PL LEFT JOIN @Pool_Consumption PC ON PC.Pool = PL.Pool WHERE Lot = 1 UNION ALL -- Recursive Member: Process subsequent lots SELECT PL.Pool, PL.Lot, PL.Quantity, CTE.QuantityConsumed, CASE WHEN CTE.RunningQuantity + PL.Quantity >= CTE.RemainingDemand THEN CTE.RunningQuantity + PL.Quantity - CTE.RemainingDemand ELSE 0 END, CASE WHEN CTE.RunningQuantity + PL.Quantity >= CTE.RemainingDemand THEN 0 ELSE CTE.RemainingDemand - CTE.RunningQuantity - PL.Quantity END FROM Amos CTE JOIN @Pooled_Lots PL ON PL.Pool = CTE.Pool AND PL.Lot = CTE.Lot + 1 ) -- Final Result Set SELECT *, CASE WHEN Lot = (SELECT MAX(Lot) FROM @Pooled_Lots WHERE Pool = Amos.Pool) THEN RunningQuantity - RemainingDemand ELSE NULL END AS SurplusOrDeficit FROM Amos ORDER BY Pool, Lot;</code>
Diese verfeinerte Erklärung und dieses Beispiel vermitteln ein klareres Verständnis der Funktionalität des rekursiven CTE und seiner Anwendung in der Bestandsverwaltung. Die SurplusOrDeficit
Berechnung ist jetzt explizit an das letzte Los in jedem Pool gebunden.
Das obige ist der detaillierte Inhalt vonWie kann ein rekursiver CTE Verbrauchsmaterialmengen auf gepoolte Chargen verteilen und verfolgen und dabei eine detaillierte Aufschlüsselung der verbleibenden und ausstehenden Mengen bereitstellen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!