2013-05-01 104 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