2009-07-16 12 views
7

Non so come chiamarla oltre a una colonna "accumulata".MySQL seleziona la colonna "accumulata"

Ho una tabella di MySQL con una colonna che assomiglia

+---+ 
|val| 
+---+ 
| 1 | 
| 4 | 
| 6 | 
| 3 | 
| 2 | 
| 5 | 
+---+ 

voglio fare una query in modo che ricevo questa colonna insieme ad un'altra colonna, che è la somma di tutte le righe da questa colonna in modo lontano. In altre parole, il prescelto sarebbe cedere

+---+----+ 
|val| sum| 
+---+----+ 
| 1 | 1 | 
| 4 | 5 | 
| 6 | 11 | 
| 3 | 14 | 
| 2 | 16 | 
| 5 | 21 | 
+---+----+ 

Qualcuno sa come farei questo, e se si può fare questo in MySQL?

risposta

7

Che dire

set @running_sum=0 
select val, @running_sum:[email protected]_sum + val from your_table; 

Sono nuovo di mysql in modo da prendere ciò che dico con un grano di sale.

Quello che vuoi si chiama una somma corrente. Ci sono alcuni google results.

0

Non so come fare se con una selezione, ma penso che si possano selezionare gli elementi, quindi il cursore 'accumula' sul secondo passaggio.

0

vorrei utilizzare un cursor:

>>> import MySQLdb 
>>> db = MySQLdb.connect("localhost","username","password","test") 
>>> cur = db.cursor() 
>>> cur.execute("select myval from mytable") 
>>> rs = cur.fetchall() 
>>> accumulator = 0 
>>> for r, in rs: 
... accumulator += r 
... print r, accumulator 
... 
1 1 
4 5 
6 11 
3 14 
2 16 
5 21 
5

Un'altra variante (singola linea) può essere

SELECT val, @sm := @sm + val AS sum 
    FROM myTable, (SELECT @sm := 0) r; 

Se non si desidera utilizzare le variabili si possono usare nidificato selezionare tuttavia si noti che questa query ha una maggiore complessità (prestazioni inferiori) e si deve impostare e ancorare per l'ordinamento, nel mio esempio ho usato _rowid ma qualsiasi altro campo può fare il lavoro

SELECT x1.val, (SELECT sum(val) 
        FROM myTable 
        WHERE id <= x1._rowid) 
        AS sum 
    FROM myTable AS x1 
ORDER BY _rowid;