如何在没有主键的情况下合并 2 行或更多行并对 UPDATE 中的列求和

问题描述 投票:0回答:2

所以我在 SQL Server 中有一个表,如下所示...

| CTransaction | CQuantity | CItemCode| CUOM |
| 001          | 2         | 0011     | PACK |  
| 001          | 5         | 0011     | PACK |  
| 001          | 1         | 0011     | PACK |  
| 002          | 3         | 0011     | PACK |  
| 002          | 3         | 0011     | PACK | 

基本上,该表包含项目详细信息以及相应的 CTransaction。我想合并和更新具有相同 CTransaction 和 CItemCode 的行,同时汇总它们的 CQuantity。更新之后,结果就变成了下面这个表的样子...

| CTransaction | CQuantity | CItemCode| CUOM |
| 001          | 8         | 0011     | PACK |  
| 002          | 6         | 0011     | PACK | 

我在here找到了类似的问题,但是该示例包含主键。我的表没有主键,我不知道该怎么做。这可能吗?请帮帮我。

如果我只是要像这样选择行,这会很容易......

SELECT CTransaction, SUM(CQuantity), CItemCode, CUOM FROM Table GROUP BY CTransaction,CItemCode,CUOM

但我不想要这个。我想更新表以实际永久删除重复项。

非常感谢。

sql-server group-by merge sum
2个回答
0
投票

每个表都应该有一个主键。

可以使用

MERGE
来实现此目的。一种方法如下。

WITH Tgt AS
(
SELECT *, 
        SumCTransaction = SUM(CQuantity) OVER (PARTITION BY CTransaction, CItemCode, CUOM ),
        rn = ROW_NUMBER() OVER (PARTITION BY CTransaction, CItemCode, CUOM  ORDER BY CTransaction) 
FROM YourTable
) 
Merge Tgt
USING (VALUES(1)) src(rn) ON src.rn = Tgt.rn
WHEN MATCHED THEN UPDATE SET CQuantity = SumCTransaction
WHEN NOT MATCHED BY SOURCE THEN DELETE;

0
投票

鉴于您已经声明您可能需要定期执行此汇总,因此使用您已创建的聚合查询在源表之上创建视图可能是最有意义的:

CREATE VIEW yourView AS
SELECT CTransaction, CItemCode, CUOM, SUM(CQuantity)
FROM yourTable
GROUP BY CTransaction, CItemCode, CUOM;
© www.soinside.com 2019 - 2024. All rights reserved.