2013-05-01 148 views
1

我有一张包含捐款的表,现在我正在创建一个页面来查看统计信息。我想从毛重和累计毛额的数据库中提取每月数据。从MySQL表获取累计总和

mysql> describe donations; 
+------------------+------------------+------+-----+---------+----------------+ 
| Field   | Type    | Null | Key | Default | Extra   | 
+------------------+------------------+------+-----+---------+----------------+ 
| id    | int(10) unsigned | NO | PRI | NULL | auto_increment | 
| transaction_id | varchar(64)  | NO | UNI |   |    | 
| donor_email  | varchar(255)  | NO |  |   |    | 
| net    | double   | NO |  | 0  |    | 
| gross   | double   | NO |  | NULL |    | 
| original_request | text    | NO |  | NULL |    | 
| time    | datetime   | NO |  | NULL |    | 
| claimed   | tinyint(4)  | NO |  | NULL |    | 
+------------------+------------------+------+-----+---------+----------------+ 

这是我已经试过:

SET @cgross = 0; 
SELECT YEAR(`time`), MONTH(`time`), SUM(`gross`), (@cgross := @cgross + SUM(`gross`)) AS `cumulative_gross` FROM `donations` GROUP BY YEAR(`time`), MONTH(`time`); 

结果是:

+--------------+---------------+--------------+------------------+ 
| YEAR(`time`) | MONTH(`time`) | SUM(`gross`) | cumulative_gross | 
+--------------+---------------+--------------+------------------+ 
|   2013 |    1 |   257 |    257 | 
|   2013 |    2 |   140 |    140 | 
|   2013 |    3 |   311 |    311 | 
|   2013 |    4 |   279 |    279 | 
+--------------+---------------+--------------+------------------+ 

哪项是错误的。期望的结果是:

+--------------+---------------+--------------+------------------+ 
| YEAR(`time`) | MONTH(`time`) | SUM(`gross`) | cumulative_gross | 
+--------------+---------------+--------------+------------------+ 
|   2013 |    1 |   257 |    257 | 
|   2013 |    2 |   140 |    397 | 
|   2013 |    3 |   311 |    708 | 
|   2013 |    4 |   279 |    987 | 
+--------------+---------------+--------------+------------------+ 

我试过这个没有SUM,它没有按预期工作。

SET @cgross = 0; 
SELECT YEAR(`time`), MONTH(`time`), SUM(`gross`), (@cgross := @cgross + 10) AS `cumulative_gross` FROM `donations` GROUP BY YEAR(`time`), MONTH(`time`); 

+--------------+---------------+--------------+------------------+ 
| YEAR(`time`) | MONTH(`time`) | SUM(`gross`) | cumulative_gross | 
+--------------+---------------+--------------+------------------+ 
|   2013 |    1 |   257 |    10 | 
|   2013 |    2 |   140 |    20 | 
|   2013 |    3 |   311 |    30 | 
|   2013 |    4 |   279 |    40 | 
+--------------+---------------+--------------+------------------+ 

为什么它不适用于SUM?任何想法如何我可以修复它?

感谢, Lassi的

回答

4

不变量的子查询将做到这一点很容易,而且相当多的可移植性;

SELECT YEAR(`time`), 
     MONTH(`time`), 
     SUM(gross), 
     (SELECT SUM(gross) 
     FROM donations 
     WHERE `time`<=MAX(a.`time`)) cumulative_gross 
FROM donations a GROUP BY YEAR(`time`), MONTH(`time`); 

An SQLfiddle to test with

+0

优秀,似乎工作。谢谢。 – Lassi 2013-05-02 13:46:33