ホームページ >データベース >mysql チュートリアル >SQL 再帰 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 サイトの他の関連記事を参照してください。