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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 21:04:52