2010-04-05 4 views
2

У меня есть таблица с датой (формат: «Y-m-d H: i: s») поле «created» и поле «amount» (целое) в каждой строке. Теперь я хочу узнать месячную сумму «сумма» в прошлом году. Как я могу это сделать?Как группировать строки MySql на основе месяца?

EDIT

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

EDIT2

В прошлом году средства последние 365 дней. Итак, где-то я должен рассмотреть «текущий день»?

EDIT3

Мой плохо, на самом деле в прошлом году за последние 12 месяцев. Так количество дней будет находиться в диапазоне от 336 и 365.

ответ

8

Попробуйте (обновлено, чтобы ответить на ваш "EDIT3"):

SELECT 
    YEAR(created) as year, 
    MONTH(created) AS month, 
    SUM(amount) AS total_amount 
FROM table1 
WHERE created 
    BETWEEN DATE(NOW()) - INTERVAL (DAY(NOW()) - 1) DAY - INTERVAL 11 MONTH 
    AND NOW() 
GROUP BY YEAR(created), MONTH(created) 
ORDER BY YEAR(created), MONTH(created); 

Пример результата (при запуске в апреле 2010):

year month total_amount 
2009 5  26 
2010 1  20 

Обратите внимание, что месяцы без записей не будут возвращены вообще (а не возвращаются с total_amount = 0).

Тестовые данные:

CREATE TABLE table1 (created datetime NOT NULL, amount INT NOT NULL); 
INSERT INTO table1 (created, amount) VALUES 
('2010-01-01 13:56:23', 5), 
('2010-01-04 13:56:23', 15), 
('2009-05-04 13:56:23', 26); 
+0

@Mark Byers: Если в прошлом году считается периодом между текущим и последним 365 днями, то какие изменения потребуются? – understack

+0

@understack: 'WHERE created BETWEEN DATE_SUB (СЕЙЧАС(), INTERVAL 365 DAY) И NOW()'. Также подумайте об использовании 'INTERVAL 1 YEAR' вместо' INTERVAL 365 DAY', если это то, что вы на самом деле имеете в виду. –

+0

@Mark Byers: не могли бы вы предложить изменения для моего EDIT3? Благодарю. – understack

0
SELECT count(some_row) AS or_whatever FROM your_table GROUP BY MONTH(update); 

Чтобы быть более конкретным (с обновлением):

SELECT SUM(amount) FROM table_name GROUP BY MONTH(created); 
2

Это возвращает количество и общая сумма за прошлый год:

SELECT MONTH(created) as month_updated, 
    COUNT(created) as month_updates, SUM(amount) as month_total FROM table 
WHERE created BETWEEN DATE_ADD(NOW(), INTERVAL -1 YEAR) AND NOW() 
GROUP BY MONTH(created) 

Или, если вы имеете в виду только 2009:

SELECT MONTH(created) as month_updated, 
    COUNT(created) as month_updates, SUM(amount) as month_total FROM table 
WHERE created BETWEEN '2009-01-01 00:00:00' AND '2009-12-31 23:59:59' 
GROUP BY MONTH(created) 
+0

Удивительный запрос сэр. +1 с моей стороны. Это сработало в моем случае, теперь я могу найти общую сумму в месяц. – w3uiguru