집 >데이터 베이스 >MySQL 튜토리얼 >순환적 CTE는 어떻게 풀링된 로트 전체에서 소모품 수량을 배포하고 추적하여 남은 수량과 미결제 수량에 대한 세부 분석을 제공할 수 있습니까?
여러 로트에 걸친 소모품 재고 추적
효율적인 재고 관리를 위해서는 풀링된 로트 전체의 소모품 수량을 정확하게 추적해야 합니다. 이를 위해서는 특정 기준에 따라 여러 로트의 소비량을 정확하게 공제하는 쿼리가 필요합니다. 제시된 솔루션은 이를 달성하기 위해 재귀적 공통 테이블 표현식(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 중국어 웹사이트의 기타 관련 기사를 참조하세요!