ホームページ >データベース >mysql チュートリアル >再帰的 CTE はプールされたロット全体で消耗品の数量をどのように分配して追跡し、残りの数量と未払いの数量の詳細な内訳を提供できるでしょうか?
複数のロットにわたる消耗品在庫の追跡
効率的な在庫管理には、プールされたロット全体での消耗品の数量の正確な追跡が必要です。 これには、特定の基準に基づいて複数のロットから消費量を正確に差し引くクエリが必要になります。 提示されたソリューションでは、再帰的な Common Table Expression (CTE) を利用してこれを実現します。
再帰的 CTE アプローチ:
ソリューションの中核は、「Amos」という巧みな名前が付けられた再帰的 CTE で、プールされたロットを反復処理します。 まず、各プールを最初のロットで初期化します。 その後、CTE は後続のロットを再帰的に処理し、消費数量を動的に更新します。
各ロットについて、CTE は累積消費量に基づいて RunningQuantity
(残存数量) と RemainingDemand
(未払い数量) を計算します。 これらの値は、同じプール内の後続のロットの計算を通知するために使用されます。
出力の詳細:
最終的な結果セットには、次のような各プールとロットの包括的な内訳が表示されます。
実装例:
次の例は、サンプル データを使用してクエリの機能を示しています。
<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 サイトの他の関連記事を参照してください。