按聚合值删除行:移除聚合为0的正负抵消明细行
删除聚合值为0的明细行解决方案
我来帮你搞定这个需求——要移除那些按orderid、account、vatid分组后,amount和vat总和都为0的明细行,对吧?这类行通常是一正一负完全抵消的记录,留着反而会干扰后续的交易处理。
实现思路
- 先按核心维度(
orderid、account、vatid)分组,计算每组的总金额和总税额 - 筛选出总金额和总税额都为0的分组
- 删除临时表中属于这些分组的所有明细行
完整代码示例
DECLARE @tmp TABLE ( orderid INT , account INT , vatid INT , amount DECIMAL(10,2) , vat DECIMAL(10,2) ) -- 测试数据 INSERT @tmp VALUES ( 10001, 30500, 47, 175.50, 9.20 ) , ( 10001, 30501, 47, 2010.60, 18.30 ) , ( 10001, 30501, 47, -2010.60, -18.30 ), -- 这行会和上一行抵消,聚合后总和为0 ( 10002, 30500, 47, 147.65, 8.05 ), ( 10002, 30500, 47, -147.65, -8.05 ); -- 这组聚合后总和为0,会被删除 -- 执行删除操作 WITH AggregatedGroups AS ( SELECT orderid, account, vatid, SUM(amount) AS total_amount, SUM(vat) AS total_vat FROM @tmp GROUP BY orderid, account, vatid HAVING SUM(amount) = 0 AND SUM(vat) = 0 ) DELETE t FROM @tmp t JOIN AggregatedGroups ag ON t.orderid = ag.orderid AND t.account = ag.account AND t.vatid = ag.vatid; -- 验证结果 SELECT * FROM @tmp;
代码说明
- CTE
AggregatedGroups:负责计算每个分组的总金额和总税额,并用HAVING子句筛选出完全抵消的分组。 - DELETE关联:通过关联临时表和筛选出的分组,精准删除所有属于这些无效分组的明细行。
- 我在测试数据里加了两组抵消的记录,你可以运行代码看看效果,剩下的就是聚合值不为0的有效行。
内容的提问来源于stack exchange,提问作者Reto E.
相关产品推荐
相关产品推荐

