2009-07-16 3 views
7

Я не уверен, что назвать это, кроме «скопированного» столбца.MySQL выберите «накопленный» столбец

У меня есть таблица MySQL с колонкой, которая выглядит как

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

Я хочу, чтобы сделать запрос, так что я получаю эту колонку вместе с другим столбцом, который является суммой всех строк из этой колонки далеко. Другими словами, выбор даст

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

Я не знаю, как \ если бы вы сделали это с одним выбором, но я думаю, что вы могли бы выбрать элементы, а затем наложить курсор на второй проход.

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

Еще одна вариация (однострочный) может быть

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; 
Смежные вопросы