首页 > 数据库 > mysql教程 > 递归 CTE 如何分配和跟踪合并批次中的消耗品数量,提供剩余数量和未完成数量的详细分类?

递归 CTE 如何分配和跟踪合并批次中的消耗品数量,提供剩余数量和未完成数量的详细分类?

Mary-Kate Olsen
发布: 2025-01-10 10:10:41
原创
124 人浏览过

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

跟踪多个批次的消耗品库存

高效的库存管理需要精确跟踪合并批次中的消耗品数量。 这就需要一个查询,根据特定条件准确地从多个批次中扣除消耗量。 所提出的解决方案利用递归通用表表达式 (CTE) 来实现此目的。

递归 CTE 方法:

该解决方案的核心是递归 CTE,巧妙地命名为“Amos”,它会迭代池中的批次。 首先用第一批来初始化每个池。 然后,CTE 递归处理后续批次,动态更新消耗数量。

对于每一批次,CTE 根据累计消耗计算RunningQuantity(剩余数量)和RemainingDemand(未结数量)。 然后,这些值将用于通知同一池中后续批次的计算。

输出详细信息:

最终结果集提供了每个池和批次的全面细分,包括:

  • 池:池的 ID。
  • 批次:泳池内的批次号。
  • 数量: 批次的初始数量。
  • 消耗数量: 此批次消耗的数量。
  • 运行数量:消耗后剩余数量。
  • 剩余需求:尚未消耗的剩余数量。
  • 盈余或赤字: 表示处理池中最后一批后的任何盈余或赤字。

示例实现:

以下示例使用示例数据演示了查询的功能:

<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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板