ホームページ >データベース >mysql チュートリアル >再帰的 CTE はプールされたロット全体で消耗品の数量をどのように分配して追跡し、残りの数量と未払いの数量の詳細な内訳を提供できるでしょうか?

再帰的 CTE はプールされたロット全体で消耗品の数量をどのように分配して追跡し、残りの数量と未払いの数量の詳細な内訳を提供できるでしょうか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-10 10:10:41165ブラウズ

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

複数のロットにわたる消耗品在庫の追跡

効率的な在庫管理には、プールされたロット全体での消耗品の数量の正確な追跡が必要です。 これには、特定の基準に基づいて複数のロットから消費量を正確に差し引くクエリが必要になります。 提示されたソリューションでは、再帰的な Common Table Expression (CTE) を利用してこれを実現します。

再帰的 CTE アプローチ:

ソリューションの中核は、「Amos」という巧みな名前が付けられた再帰的 CTE で、プールされたロットを反復処理します。 まず、各プールを最初のロットで初期化します。 その後、CTE は後続のロットを再帰的に処理し、消費数量を動的に更新します。

各ロットについて、CTE は累積消費量に基づいて RunningQuantity (残存数量) と RemainingDemand (未払い数量) を計算します。 これらの値は、同じプール内の後続のロットの計算を通知するために使用されます。

出力の詳細:

最終的な結果セットには、次のような各プールとロットの包括的な内訳が表示されます。

  • プール: プールの ID。
  • ロット: プール内のロット番号。
  • 数量: ロットの初期数量。
  • QuantityConsumed: このロットから消費された数量。
  • RunningQuantity: 消費後の残りの数量。
  • RemainingDemand: まだ消費されていない未処理の数量。
  • SurplusOrDeficit: プール内の最後のロットを処理した後の余剰または不足を示します。

実装例:

次の例は、サンプル データを使用してクエリの機能を示しています。

<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>

この洗練された説明と例は、再帰的 CTE の機能と在庫管理におけるその応用をより明確に理解するのに役立ちます。 SurplusOrDeficit 計算は、各プールの最後のロットに明示的に関連付けられるようになりました。

以上が再帰的 CTE はプールされたロット全体で消耗品の数量をどのように分配して追跡し、残りの数量と未払いの数量の詳細な内訳を提供できるでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。