2009-07-16 70 views
7

Tôi không chắc chắn nên gọi điều gì ngoài cột "tích lũy".MySQL chọn cột "tích lũy"

Tôi có một bảng với một cột trông giống như

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

tôi muốn làm một truy vấn để tôi có được cột này cùng với một cột mà là tổng hợp của tất cả các hàng từ cột này MySQL để xa. Nói cách khác, lựa chọn sẽ mang lại

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

Có ai biết tôi sẽ làm điều này không và liệu bạn có thể làm điều này trong MySQL không?

Trả lời

7

gì về

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

Tôi mới đến mysql để mất những gì tôi nói với một hạt muối.

Điều bạn muốn được gọi là tổng số đang chạy. Có một số google results.

0

Tôi không biết làm thế nào \ nếu bạn sẽ làm điều đó với một lựa chọn nhưng tôi nghĩ rằng bạn có thể chọn các yếu tố sau đó có một con trỏ 'tích lũy' trên vượt qua thứ hai.

0

Tôi sẽ sử dụng một 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

Một biến thể (dòng đơn) có thể

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

Nếu bạn không muốn sử dụng biến mà bạn có thể sử dụng lồng chọn tuy nhiên lưu ý rằng truy vấn này có độ phức tạp cao hơn (hiệu năng thấp hơn) và bạn phải đặt và neo để sắp xếp, trong ví dụ của tôi, tôi đã sử dụng _rowid nhưng bất kỳ trường nào khác có thể thực hiện công việc

SELECT x1.val, (SELECT sum(val) 
        FROM myTable 
        WHERE id <= x1._rowid) 
        AS sum 
    FROM myTable AS x1 
ORDER BY _rowid; 
Các vấn đề liên quan