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?

Wie kann ein rekursiver CTE Verbrauchsmaterialmengen auf gepoolte Chargen verteilen und verfolgen und dabei eine detaillierte Aufschlüsselung der verbleibenden und ausstehenden Mengen bereitstellen?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2025-01-10 10:10:41125Durchsuche

How can a recursive CTE distribute and track consumable quantities across pooled lots, providing a detailed breakdown of remaining and outstanding quantities?

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:

  • Pool:Die ID des Pools.
  • Los: Die Losnummer innerhalb des Pools.
  • Menge: Die ursprüngliche Menge der Charge.
  • Verbrauchsmenge: Die von dieser Charge verbrauchte Menge.
  • Laufende Menge:Die verbleibende Menge nach dem Verzehr.
  • Verbleibende Nachfrage: Die ausstehende Menge, die noch verbraucht werden muss.
  • SurplusOrDeficit: Zeigt einen etwaigen Überschuss oder Defizit nach der Verarbeitung des letzten Loses in einem Pool an.

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!

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