2009-07-16 6 views
7

「累積」列のほかに何を呼び出すべきかわかりません。MySQLは「累積」列を選択します

私は私がこの列のすべての行の合計であり、他の列と一緒にこの列を取得するようにクエリを実行したい

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

のように見えるの列とMySQLのテーブルを持っています遠い言い換えれば、選択は、誰もが、私はこれを行うだろうか知ってい

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

をもたらすであろう、そしてあなたは、MySQLでこれを行うことができるかどうか?

答えて

7

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

について私は、MySQLへの新たなんだと、私は塩の粒で言う取ります。

あなたが望むものは、ランニングサムと呼ばれます。 google resultsがあります。

0

私はあなたが1つの選択でそれを行う方法はわかりませんが、要素を選択して2番目のパスにカーソルが累積すると思います。

0

私は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

別のバリエーション(1行)

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

することができこのクエリはより複雑(低いパフォーマンス) を持ち、ソートのために設定し、アンカーする必要があります。私の例では_rowidを使用しましたが、他のフィールドはジョブを実行できます

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