2009-07-02 6 views
1

Ich suche eine SQL-Anweisung zu erstellen, die eine große Menge von Daten aktualisieren wird.MySQL merge Beträge in 2 Zeilen

Was ich habe, ist eine Tabelle, wie

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 

Wenn es zwei Zeilen mit demselben transid ich sie das Ergebnis in der gesamten Spalte der ersten mit dieser transid setzen insgesamt müssen, und die zweite setzen Betrag in naritive2 der ersten Instanz sowie machen Sie die zweite inaktiv. Es sollte einzelne Zeilen für eine Transid ignorieren.

Das Ergebnis, was ich will sollte tun:

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 

Ich weiß, ein bisschen wie ein Tanga Twister aber ..

Ideal nur MySQL-Anweisungen in Ich möchte, dies zu tun . Also habe ich nichts dagegen, mehrere SQL-Anweisungen zu machen, aber ich möchte vermeiden, es mit PHP usw. zu verbinden. Es ist eine sehr große Menge von Daten.

+0

was genau wird aktualisiert? In Ihrem Beispiel wurden nur wenige Werte geändert. Woher nehmen Sie die Werte, von denen Sie aktualisieren möchten? Willst du das mit der Hand machen? Wie schreibe ich eine SQL-Anweisung mit allen Einträgen/Werten? – markus

+0

werden die Beträge aus Zeile 1 und 2 addiert. d.h. 23,2 + 120,33 = 143,53 und die Summe wird in die erste Zeile gesetzt. Die zweite Reihe ist dann deaktiviert. –

Antwort

3

Dadurch werden nur die Transaktionen aktualisiert, die genau 2 Zeilen haben (nicht 1 und nicht 3 oder mehr).

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) 
+0

wow, du bist gut in diesem Zeug. Will es ausprobieren und sehen, wie wir gehen. –

+0

hat perfekt funktioniert. Vielen Dank! –