2009-07-02 69 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)