SQL Server无主键表:如何合并多行并SUM列执行UPDATE操作
在无主键的SQL Server表中合并重复行并求和更新
针对你的需求,完全可以实现。下面提供两种可靠的方案:
方案一:临时表汇总替换法(简单直接)
适合数据量不大的场景,步骤清晰易操作:
-- 1. 将汇总结果存入临时表 SELECT CTransaction, SUM(CQuantity) AS CQuantity, CItemCode, CUOM INTO #TempSummary FROM YourTableName -- 替换为你的实际表名 GROUP BY CTransaction, CItemCode, CUOM; -- 2. 清空原表(⚠️执行前务必备份数据!) TRUNCATE TABLE YourTableName; -- 3. 将汇总数据插回原表 INSERT INTO YourTableName (CTransaction, CQuantity, CItemCode, CUOM) SELECT CTransaction, CQuantity, CItemCode, CUOM FROM #TempSummary; -- 4. 清理临时表 DROP TABLE #TempSummary;
注意事项
TRUNCATE会彻底清空表数据,必须提前备份原表;如果表有外键约束,需要先禁用约束再操作。
方案二:CTE+ROW_NUMBER逐行处理(无需全表清空)
适合需要保留部分原始行属性、不想全表清空的场景:
-- 第一步:更新每组保留行的数量为组内总和 WITH GroupedData AS ( SELECT CTransaction, CItemCode, CUOM, SUM(CQuantity) OVER (PARTITION BY CTransaction, CItemCode, CUOM) AS TotalQuantity FROM YourTableName ), RowNumbered AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY CTransaction, CItemCode, CUOM ORDER BY (SELECT NULL)) AS RowNum FROM YourTableName ) UPDATE RowNumbered SET CQuantity = gd.TotalQuantity FROM RowNumbered rn JOIN GroupedData gd ON rn.CTransaction = gd.CTransaction AND rn.CItemCode = gd.CItemCode AND rn.CUOM = gd.CUOM WHERE rn.RowNum = 1; -- 第二步:删除每组中除第一行外的重复行 WITH RowNumbered AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY CTransaction, CItemCode, CUOM ORDER BY (SELECT NULL)) AS RowNum FROM YourTableName ) DELETE FROM RowNumbered WHERE RowNum > 1;
说明
ORDER BY (SELECT NULL)是因为无主键,仅用于随机保留每组一行;如果表中有其他可排序字段(如创建时间),可替换为该字段,确保保留特定行。
后续建议
操作完成后,建议给表添加组合唯一约束,从根源避免重复数据再次插入:
ALTER TABLE YourTableName ADD CONSTRAINT UQ_TransactionItemUOM UNIQUE (CTransaction, CItemCode, CUOM);
内容的提问来源于stack exchange,提问作者chris_techno25
相关产品推荐
相关产品推荐

