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

SQL Server 基于关联行动态求和 合并suppress商品对应SPECIAL行销售额

解决方案

你可以用条件累加分组法实现需求,核心思路是给每个suppress_print='Y'行和后续连续的SPECIAL行打上相同的组标记,再分组聚合计算总金额,纯SQL实现兼容大多数主流数据库(MySQL8.0+/PostgreSQL/Oracle等支持窗口函数的版本都可以直接运行)。

实现代码

WITH group_mark AS (
    -- 第一步:给行打分组标记,每遇到非SPECIAL行就新增一个分组ID
    SELECT 
        *,
        SUM(CASE WHEN item_id != 'SPECIAL' THEN 1 ELSE 0 END) 
            OVER (PARTITION BY order_no ORDER BY line_seq) AS grp_id
    FROM your_table_name
),
group_calc AS (
    -- 第二步:计算每个分组的总金额、判断分组是否包含suppress标记行
    SELECT 
        *,
        SUM(tot_price) OVER (PARTITION BY order_no, grp_id) AS group_total,
        MAX(CASE WHEN suppress_print = 'Y' THEN 1 ELSE 0 END) 
            OVER (PARTITION BY order_no, grp_id) AS has_suppress
    FROM group_mark
)
-- 第三步:过滤+字段替换得到最终结果
SELECT 
    item_id,
    qty_ordered,
    CASE WHEN has_suppress = 1 AND suppress_print = 'Y' THEN group_total ELSE tot_price END AS tot_price,
    line_seq,
    suppress_print,
    class
FROM group_calc
-- 过滤掉suppress分组下的SPECIAL行
WHERE NOT (has_suppress = 1 AND item_id = 'SPECIAL')
ORDER BY line_seq;

逻辑说明

  • 分组标记逻辑:grp_id只会在遇到非SPECIAL行的时候累加,所以suppress_print='Y'的商品行和它后面连续的所有SPECIAL行会被分到同一个grp_id下,直到遇到下一个非SPECIAL行自动开新分组
  • 聚合逻辑:每个分组内的金额总和会赋值给分组里唯一的suppress_print='Y'行,同组的SPECIAL行直接过滤,非suppress分组的所有行原样保留
  • 适配业务需求:如果仅需要统计class=2的商品销售额,可在最终WHERE条件中添加class = 2过滤即可,原其他行保留逻辑不受影响

内容的提问来源于stack exchange,提问作者D. Rad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 21:06:04