2009-10-13 7 views
8

J'ai un schéma de la table qui est essentiellement un tas d'informations sur les transactions avec un champ datetimeComment puis-je regrouper par mois et par année lorsque je n'ai qu'un champ datetime?

TRANSACTION (<transactionid>, amount, when) 

Je dois générer un total mensuel des transactions, qui est SUM (montant), mais je déconcerté par ce que dois-je par groupe. Chaque ligne de SQL devrait contenir le total mensuel (donc une ligne pour Jan 09, Feb 09 .... Jan 2010 et ainsi de suite). Je pense que je pourrais devoir générer la table par le code, mais aimerais apprendre s'il y a un moyen de résoudre cela en utilisant SQL.

Toute aide serait appréciée! (Utiliser 5.3 MySQL, PHP5)

+1

juste un avis pour les débutants, 'quand 'est le nom de la colonne de la table n'est pas une fonction MySQL. – GusDeCooL

Répondre

18

Vous devez regrouper par extraits.

SELECT 
    SUM(amount) 
FROM 
    transaction 
GROUP BY 
    EXTRACT(MONTH FROM when), 
    EXTRACT(YEAR FROM when) 

Et si vous avez besoin de ces colonnes, puis

SELECT 
    EXTRACT(MONTH FROM when) as month, 
    EXTRACT(YEAR FROM when) as year, 
    SUM(amount) 
FROM 
    transaction 
GROUP BY 
    month, 
    year 

Bien sûr, vous pouvez ajouter ORDER BY et utiliser des noms courts aussi:

SELECT 
    EXTRACT(MONTH FROM when) as month, 
    EXTRACT(YEAR FROM when) as year, 
    SUM(amount) 
FROM 
    transaction 
GROUP BY 
    month, 
    year 
ORDER BY 
    year DESC, 
    month DESC 
3

J'ai toujours utilisé MOIS() et AN() ... ce qui me semble un peu comme un hack, mais il fonctionne ...

SELECT SUM(amount) FROM yourTable GROUP BY MONTH(date), YEAR(date) 

Ou était-ce l'inverse? pense

Bobby

5
SELECT EXTRACT(YEAR_MONTH FROM when), sum(amount) 
     FROM TRANSACTION 
    GROUP BY EXTRACT(YEAR_MONTH FROM when) 
+0

Nice, mais ne fonctionnera pas sur toutes les bases de données :(. –

+4

la question concerne MySQL! – manji

2

Je voudrais essayer quelque chose comme ça:

SELECT 
    YEAR(when) AS year, 
    MONTH(when) AS month, 
    SUM(amount) AS amount 
FROM 
    TRANSACTION 
GROUP BY 
    YEAR(when), 
    MONTH(when) 
ORDER BY 
    YEAR(when), 
    MONTH(when) 

Cela fonctionne sur MS SQL et devrait fonctionner sur MySQL aussi.

1

Je pense que vous voulez:

SELECT SUM(amount) 
FROM yourTable 
GROUP BY CONCAT(YEAR(date), '-', MONTH(date)) 
Questions connexes