2013-05-01 3 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? Любые идеи, как я мог это исправить?

Спасибо, Ласси

ответ

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