2009-07-02 30 views
1

我正在創建一個將更新大量數據的sql語句。在2行MySQL合併金額

我有像

id, transid, amount, narative1, narative 2, total, active 
1  1234  23.2  NULL  NULL  NULL  1 
2  1234  120.33  NULL  NULL  NULL  1 
3  1235  98.00  NULL  NULL  NULL  1 

當有兩行具有相同TRANSID我需要它們加起來把結果中的第一個與TRANSID總列,並把第二個表在第一個敘述2中的數量以及使第二個在非活動狀態。它應該忽略一個transid的單行。

什麼,我想要做的應該是結果:

id, transid, amount, narative1, narative 2, total,  active 
1  1234  23.2  NULL  120.33  143.53  1  
2  1234  120.33  NULL  NULL  NULL  0 
3  1235  98.00  NULL  NULL  NULL  1 

我知道有點丁字褲捻線但..

理想情況下,我想做到這一點,在短短一個MySQL聲明。所以我不介意必須做多個sql語句,但我想避免將它連接到PHP等。它是一個非常大的數據集。

+0

究竟會更新什麼?在你的例子中,只有少數值發生了變化。你從哪裏取得你想要更新的價值!你想用手做這個嗎?像手寫所有條目/值的SQL語句? – markus 2009-07-02 11:06:15

+0

第1行和第2行的金額合計。即23.2 + 120.33 = 143.53, 並且總數被放入第一行。第二行然後停用。 – 2009-07-02 11:33:13

回答

3

這將只更新那些具有2行的事務(不是1而不是3或更多)。

UPDATE mytable mtu 
JOIN (
     SELECT minid, maxid, mtmin.amount AS minamt, mtmax.amount AS maxamt 
     FROM (
       SELECT MIN(id) AS minid, MAX(id) AS maxid 
       FROM mytable mti 
       GROUP BY 
         transid 
       HAVING COUNT(*) = 2 
       ) mt 
     JOIN mytable mtmin 
     ON  mtmin.id = minid 
     JOIN mytable mtmax 
     ON  mtmax.id = maxid 
     ) mts 
ON  id IN (minid, maxid) 
SET  narative2 = CASE id WHEN minid THEN minamt ELSE NULL END, 
     total = CASE id WHEN minid THEN minamt + maxamt ELSE NULL END, 
     active = (id = minid)