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
相关产品推荐
相关产品推荐

