ホームページ >データベース >mysql チュートリアル >SQL 再帰 CTE を使用してプールされたロット数量を削減するにはどうすればよいですか?

SQL 再帰 CTE を使用してプールされたロット数量を削減するにはどうすればよいですか?

DDD
DDDオリジナル
2025-01-10 11:46:42429ブラウズ

How to Reduce Pooled Lot Quantity Using SQL Recursive CTE?

SQL 再帰 CTE を使用してプールされたロット数量を減らす

この SQL Server 2005 ソリューションは、再帰的な共通テーブル式 (CTE) を採用し、消費データに基づいてプールされたロットの数量を繰り返し削減します。 このプロセスは、プール内の複数のロットにわたって消費量が利用可能な数量を超えるシナリオを効率的に処理します。

SQL コードは次のとおりです:

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

結果として得られるデータセットには、消費量を差し引いた後の各ロットの残りの数量が表示されます。 CTE は、消費された数量が完全に考慮されるまで、各プール内のロットを再帰的に処理します。 SurplusOrDeficit 内の負の値は不足を示すことに注意してください。

以上がSQL 再帰 CTE を使用してプールされたロット数量を削減するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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