You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL技术咨询:如何实现父项重置的特定行区间累计求和?

父项/常规项的累计求和解决方案

没问题,我来帮你搞定这个父项/常规项的累计求和需求!核心思路是先把每个父项(常规项)和它下属的组件归为同一组,然后在组内做累计求和,遇到新的父项就重置累计值。

先明确需求场景

假设你的销售订单产品表(比如叫sales_order_items)结构和示例数据如下:

示例输入表:

OrderNoItemQtyRegular Line
349443AFU20451-K2Y
349443COMP-A1N
349443COMP-B3N
349443BFX100021Y
349443COMP-C2N

其中Regular Line = 'Y'代表父项/常规项,N代表该产品是上一个父项的组件。我们需要实现:每个父项开始时累计值重置,然后把父项和后续组件的Qty依次累加,得到如下期望输出:

期望输出:

OrderNoItemQtyRegular Linecumulative_qty
349443AFU20451-K2Y2
349443COMP-A1N3
349443COMP-B3N6
349443BFX100021Y1
349443COMP-C2N3

具体SQL实现方案

我们可以用SQL的窗口函数来实现这个逻辑,分两步:先给每个父项+组件的组合生成唯一的组ID,再在组内做累计求和。

WITH grouped_items AS (
    SELECT 
        OrderNo,
        Item,
        Qty,
        `Regular Line`,
        -- 生成组ID:每遇到一个常规项(Regular Line='Y'),组ID自动加1
        COUNT(CASE WHEN `Regular Line` = 'Y' THEN 1 END) OVER (
            ORDER BY OrderNo, Item 
            ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
        ) AS group_id
    FROM sales_order_items
)
SELECT 
    OrderNo,
    Item,
    Qty,
    `Regular Line`,
    -- 在每个组内,从第一行到当前行累计求和Qty
    SUM(Qty) OVER (
        PARTITION BY group_id 
        ORDER BY OrderNo, Item
        ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
    ) AS cumulative_qty
FROM grouped_items
ORDER BY OrderNo, Item;

代码逻辑解释

  1. 生成组ID:
    用COUNT(CASE WHEN ...)的窗口函数,对所有行按OrderNo和Item排序,每遇到一个Regular Line='Y'的行,计数就加1,这样同一父项和它的组件会被分到同一个group_id里。
  2. 组内累计求和:
    用SUM(Qty)的窗口函数,按group_id分组,在每个组内从第一行到当前行累加Qty,就得到了我们需要的累计值,遇到新组(新的父项)时自动重置。

如果你的Regular Line标记规则不同(比如用1/0或者其他值区分),只需要修改CASE语句里的条件即可,比如改成CASE WHEN Regular Line = 1 THEN 1 END。

内容的提问来源于stack exchange,提问作者A. Lake

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:55:01