>데이터 베이스 >MySQL 튜토리얼 >누적 값을 유지하면서 여러 행에서 고갈되는 값을 빼는 방법은 무엇입니까?

누적 값을 유지하면서 여러 행에서 고갈되는 값을 빼는 방법은 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2025-01-10 11:55:42823검색

How to Subtract a Depleting Value from Multiple Rows While Maintaining Cumulative Values?

여러 로트에서 고갈되는 가치 빼기

이 문제는 누적 수량, 남은 수요, 잉여 또는 부족을 추적하면서 여러 재고 로트(Pooled_Lots)에 고갈되는 자원(QuantityConsumed)을 할당하는 것과 관련됩니다.

데이터 구조:

테이블이 두 개 있습니다:

  • Pooled_Lots: 각 재고 로트(풀, 로트, 수량)에 대한 세부 정보가 포함됩니다.
  • Pool_Consumption: 각 풀(PoolId, QuantityConsumed)에 소비되는 총 수량을 지정합니다.

원하는 결과:

쿼리는 다음을 포함하여 Pooled_Lots의 각 로트에 대한 결과 집합을 생성해야 합니다.

  • Pool, Lot, Quantity, QuantityConsumed, RunningQuantity, RemainingDemand, SurplusOrDeficit.

솔루션 접근 방식:

재귀적 공통 테이블 표현식(CTE)은 효과적인 솔루션을 제공합니다. 논리는 다음과 같습니다.

  1. 각 풀의 첫 번째 로트로 CTE를 초기화합니다.
  2. 각 풀 내 후속 부지의 경우:
    • 로트의 RunningQuantity가 나머지 QuantityConsumed를 초과하는 경우 Quantity를 빼서 QuantityConsumed을 업데이트합니다.
    • RemainingDemandQuantityConsumed과 현재 로트의 RunningQuantity의 합과 Quantity의 차이로 계산합니다.
    • 각 풀의 마지막 로트에 대해 SurplusOrDeficitRunningQuantity의 차이로 RemainingDemand를 계산합니다.

SQL 쿼리(예시):

제공된 쿼리가 불완전하며 일부 논리적 불일치가 포함되어 있습니다. 강력한 솔루션을 위해서는 극단적인 경우(예: QuantityConsumed 0이거나 풀에 있는 모든 로트의 총 수량을 초과하는 경우)를 주의 깊게 처리해야 합니다. 수정되고 보다 효율적인 쿼리는 특정 데이터베이스 시스템(예: SQL Server, PostgreSQL, MySQL)을 기반으로 제작되어야 합니다. 다음은 보다 정확한 접근 방식의 개념적 개요입니다.

<code class="language-sql">WITH RecursiveCTE AS (
    -- Anchor member: Select the first lot for each pool
    SELECT 
        PL.Pool, PL.Lot, PL.Quantity, PC.QuantityConsumed, 
        PL.Quantity AS RunningQuantity, 
        CASE WHEN PC.QuantityConsumed IS NULL THEN PL.Quantity ELSE PC.QuantityConsumed - PL.Quantity END AS RemainingDemand, 
        0 AS SurplusOrDeficit,
        ROW_NUMBER() OVER (PARTITION BY PL.Pool ORDER BY PL.Lot) as rn
    FROM Pooled_Lots PL
    LEFT JOIN Pool_Consumption PC ON PL.Pool = PC.PoolId
    WHERE PL.Lot = 1 --First lot

    UNION ALL

    -- Recursive member: Process subsequent lots
    SELECT 
        PL.Pool, PL.Lot, PL.Quantity, PC.QuantityConsumed,
        CASE 
            WHEN r.RemainingDemand > PL.Quantity THEN r.RunningQuantity - PL.Quantity
            ELSE r.RunningQuantity - r.RemainingDemand
        END AS RunningQuantity,
        CASE 
            WHEN r.RemainingDemand > PL.Quantity THEN r.RemainingDemand - PL.Quantity
            ELSE 0
        END AS RemainingDemand,
        CASE WHEN r.rn = (SELECT MAX(rn) FROM RecursiveCTE WHERE Pool = PL.Pool) THEN r.RunningQuantity - r.RemainingDemand ELSE 0 END AS SurplusOrDeficit,
        r.rn + 1
    FROM Pooled_Lots PL
    INNER JOIN RecursiveCTE r ON PL.Pool = r.Pool AND PL.Lot = r.rn + 1
    LEFT JOIN Pool_Consumption PC ON PL.Pool = PC.PoolId
)
SELECT * FROM RecursiveCTE
ORDER BY Pool, Lot;</code>

결과:

출력에는 누적 RunningQuantity, 나머지 RemainingDemand 및 할당 후 SurplusOrDeficit를 포함하여 각 로트의 세부 정보가 표시됩니다. RunningQuantity, RemainingDemandSurplusOrDeficit 계산의 정확성은 가능한 모든 시나리오를 처리하기 위해 재귀 CTE에 구현된 정확한 논리에 따라 달라집니다. 완벽하고 테스트된 솔루션을 위해서는 특정 데이터베이스 시스템과 검증을 위한 잠재적인 샘플 데이터를 알아야 합니다.

위 내용은 누적 값을 유지하면서 여러 행에서 고갈되는 값을 빼는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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