2010-04-05 5 views
2

J'ai une table avec un datetime (format: 'Y-m-d H: i: s') champ 'created' et champ 'amount' (entier) dans chaque ligne. Maintenant, je veux trouver le montant total par mois de l'année dernière. Comment puis-je faire ceci?comment grouper les lignes MySql en fonction du mois?

EDIT

J'a modifié cette page pour clarifier le problème réel. Donc, fondamentalement, je veux savoir le montant total de chaque mois, mais seulement pour la dernière année.

EDIT2

L'an dernier signifie 365 derniers jours. Donc, quelque part, je dois considérer «jour actuel»?

EDIT3

Mon mauvais, en fait l'année dernière est de 12 derniers mois. Donc, le nombre de jours serait compris entre 336 et 365.

Répondre

8

Essayez cette (mis à jour pour répondre à votre "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); 

Exemple de résultat (lorsqu'il est exécuté en Avril 2010):

year month total_amount 
2009 5  26 
2010 1  20 

Notez également que les mois sans entrées ne seront pas retournés du tout (au lieu d'être retournés avec total_amount = 0).

données de test:

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: Si l'année dernière est considérée comme une période entre le jour actuel et les 365 derniers jours, alors quels changements seraient nécessaires? – understack

+0

@understack: 'O WH a été créé ENTRE DATE_SUB (NOW(), INTERVAL 365 DAY) et NOW()'. Pensez également à utiliser 'INTERVAL 1 YEAR' au lieu de' INTERVAL 365 DAY' si c'est ce que vous voulez dire. –

+0

@Mark Byers: pourriez-vous suggérer les changements pour mon EDIT3? Merci. – understack

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

Pour être plus précis (avec votre mise à jour):

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

Cela renvoie le nombre et le montant total pour l'année dernière:

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) 

Ou, si vous voulez dire juste 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

Awesome requête monsieur. +1 de mon côté. Cela a fonctionné dans mon cas, maintenant je peux trouver le montant total du mois individuel. – w3uiguru

Questions connexes