2013-03-25 103 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

相關問題