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 Recursive CTE를 사용하여 풀링된 로트 수량을 줄이는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!