>데이터 베이스 >MySQL 튜토리얼 >순환적 CTE는 어떻게 풀링된 로트 전체에서 소모품 수량을 배포하고 추적하여 남은 수량과 미결제 수량에 대한 세부 분석을 제공할 수 있습니까?

순환적 CTE는 어떻게 풀링된 로트 전체에서 소모품 수량을 배포하고 추적하여 남은 수량과 미결제 수량에 대한 세부 분석을 제공할 수 있습니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2025-01-10 10:10:41191검색

How can a recursive CTE distribute and track consumable quantities across pooled lots, providing a detailed breakdown of remaining and outstanding quantities?

여러 로트에 걸친 소모품 재고 추적

효율적인 재고 관리를 위해서는 풀링된 로트 전체의 소모품 수량을 정확하게 추적해야 합니다. 이를 위해서는 특정 기준에 따라 여러 로트의 소비량을 정확하게 공제하는 쿼리가 필요합니다. 제시된 솔루션은 이를 달성하기 위해 재귀적 공통 테이블 표현식(CTE)을 활용합니다.

재귀적 CTE 접근 방식:

솔루션의 핵심은 풀링된 로트를 반복하는 "Amos"라는 영리한 이름의 재귀 CTE입니다. 첫 번째 로트로 각 풀을 초기화하는 것으로 시작됩니다. 그런 다음 CTE는 후속 로트를 재귀적으로 처리하여 소비 수량을 동적으로 업데이트합니다.

CTE는 각 로트에 대해 누적 소모량을 기준으로 RunningQuantity(남은 수량)과 RemainingDemand(미결제 수량)을 계산합니다. 그런 다음 이 값은 동일한 풀 내의 후속 로트에 대한 계산을 알리는 데 사용됩니다.

출력 세부정보:

최종 결과 세트는 다음을 포함하여 각 풀 및 로트에 대한 포괄적인 분석을 제공합니다.

  • 풀: 풀의 ID입니다.
  • Lot: 수영장 내 Lot 번호
  • 수량: 로트의 초기 수량입니다.
  • 소비 수량: 이 로트에서 소비된 수량입니다.
  • 실행수량: 소비 후 남은 수량입니다.
  • 남은 수요량: 아직 소모되지 않은 수량입니다.
  • SurplusOrDeficit: 풀의 마지막 로트를 처리한 후의 잉여 또는 부족을 나타냅니다.

구현 예:

다음 예에서는 샘플 데이터를 사용한 쿼리 기능을 보여줍니다.

<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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.