SQL技术咨询:如何实现父项重置的特定行区间累计求和?
父项/常规项的累计求和解决方案
没问题,我来帮你搞定这个父项/常规项的累计求和需求!核心思路是先把每个父项(常规项)和它下属的组件归为同一组,然后在组内做累计求和,遇到新的父项就重置累计值。
先明确需求场景
假设你的销售订单产品表(比如叫sales_order_items)结构和示例数据如下:
示例输入表:
OrderNo Item Qty Regular Line 349443 AFU20451-K 2 Y 349443 COMP-A 1 N 349443 COMP-B 3 N 349443 BFX10002 1 Y 349443 COMP-C 2 N
其中Regular Line = 'Y'代表父项/常规项,N代表该产品是上一个父项的组件。我们需要实现:每个父项开始时累计值重置,然后把父项和后续组件的Qty依次累加,得到如下期望输出:
期望输出:
OrderNo Item Qty Regular Line cumulative_qty 349443 AFU20451-K 2 Y 2 349443 COMP-A 1 N 3 349443 COMP-B 3 N 6 349443 BFX10002 1 Y 1 349443 COMP-C 2 N 3
具体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;
代码逻辑解释
- 生成组ID:
用COUNT(CASE WHEN ...)的窗口函数,对所有行按OrderNo和Item排序,每遇到一个Regular Line='Y'的行,计数就加1,这样同一父项和它的组件会被分到同一个group_id里。 - 组内累计求和:
用SUM(Qty)的窗口函数,按group_id分组,在每个组内从第一行到当前行累加Qty,就得到了我们需要的累计值,遇到新组(新的父项)时自动重置。
如果你的Regular Line标记规则不同(比如用1/0或者其他值区分),只需要修改CASE语句里的条件即可,比如改成CASE WHEN Regular Line = 1 THEN 1 END。
内容的提问来源于stack exchange,提问作者A. Lake
相关产品推荐
相关产品推荐

