MySQL选择“累积”列

8

除了“累积”列,我不确定该如何称呼它。

我有一个MySQL表格,其中一列看起来像:

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

我想进行一次查询,以便获取这一列以及另一列的总和,该总和是迄今为止从此列中所有行的总和。换句话说,选择将产生

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

有人知道如何实现这个功能吗?是否可以在MySQL中实现?

4个回答

9

那么

set @running_sum=0
select val, @running_sum:=@running_sum + val from your_table;

我对MySQL不太熟悉,所以我的话请谨慎参考。

您想要的是称为"Running Sum"的内容。您可以查看一些谷歌搜索结果


5

另一种变体(单行)可以是

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

如果您不想使用变量,可以使用嵌套的select语句,但请注意,这个查询具有更高的复杂度(较低的性能),并且您必须设置一个排序锚点,在我的例子中,我使用了_rowid,但任何其他字段都可以胜任。
  SELECT x1.val, (SELECT sum(val)
                    FROM myTable
                   WHERE id <= x1._rowid)
                    AS sum
    FROM myTable AS x1
ORDER BY _rowid;

0

我会使用一个光标

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

0

我不知道如何/是否可以使用一个选择器来完成这个任务,但我认为你可以先选择元素,然后在第二次遍历时让光标“累加”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接