2013-03-25 104 views
1

我发现了很多关于如何删除重复行的示例,但它们都涉及具有唯一整数ID的行。如何将行数据添加到第一次出现的字符串字段

这是我需要知道的。我想合并所有重复的字符串,并将其他列的值相加。

我有这样的:

stringID | v1 | v2 | v3 
    a | 2 | 3 | 4 
    b | 5 | 4 | 1 
    a | 1 | 1 | 2 
    b | 2 | 1 | 1 

我想这一点:

stringID | v1 | v2 | v3 
    a | 3 | 4 | 6 
    b | 7 | 5 | 2 

谢谢你的帮助。

编辑 我使用的是MySQL

+0

这RBDMS这是什么? MySQL的? Sql Server?甲骨文? – 2013-03-25 21:44:44

回答

3

我认为只是一个简单的GROUP BYSUM()应该给你你要寻找的结果:

SELECT 
    StringID, 
    SUM(v1) AS v1, 
    SUM(v2) AS v2, 
    SUM(v3) AS v3 
FROM YourTable 
GROUP BY StringID 

See it in action with Sql Fiddle

+0

他想更新/删除行。 – 2013-03-25 21:46:04

+0

谢谢,它的工作!其实,我不需要改变数据,我只是创建一个视图:)谢谢! – 2013-03-25 21:55:19

0

尝试......

select stringID, sum(v1), sum(v2), sum(v3) 
from yourtable 
group by stringID 
1

(免责声明:使用SQL-服务器> = 2005)

所以要与所有记录的总和先更新,那么你要删除的DUP:

更新:

WITH CTE AS 
(
    SELECT stringID, 
      v1_sum = SUM(v1) OVER (PARTITION BY stringID), 
      v2_sum = SUM(v2) OVER (PARTITION BY stringID), 
      v3_sum = SUM(v3) OVER (PARTITION BY stringID), 
      RN = ROW_NUMBER()OVER(PARTITION BY stringId Order By stringId) 
    FROM dbo.TableName 
) 
UPDATE tn SET v1 = v1_sum, v2 = v2_sum, v3 = v3_sum 
FROM CTE c 
INNER JOIN dbo.TableName tn ON c.stringId=tn.stringId 
WHERE c.RN = 1; 

删除:

WITH CTE AS 
(
    SELECT 
     RN = ROW_NUMBER()OVER(PARTITION BY stringId Order By stringId) 
    FROM dbo.TableName 
) 
DELETE FROM CTE WHERE RN > 1; 

DEMO

+0

谢谢。查询数据很好,但是这非常好。 – 2013-03-25 22:03:04

+0

这是一个很酷的演示。 – 2013-03-25 22:04:30

+0

@viau_a:不客气。不过,我已经看到你的mysql-edit太晚了,所以这种方法只适用于MS SQL-Server。 – 2013-03-25 22:04:50

相关问题