2011-02-18 4 views
1

J'ai une table dans Postgres et MySQL avec une colonne 'created_at'. Je voudrais l'interroger pour ce qui suit:Statistiques mensuelles

Month Count 
1  0 
2  0 
3  0 
4  12 
5  15 
... 

Quelqu'un peut-il cracher quelque sql? Notez que les mois sans lignes retournées doivent être listés comme 0. J'ai ceci:

SELECT month(created_at) as month, count(*) as c 
FROM `sale_registrations` 
WHERE (created_at>='2011-01-01' and created_at<='2011-12-31') 
GROUP BY month(created_at) 
ORDER BY month(created_at) 

Répondre

1

Utilisez EXTRACT(month FROM created_at) pour obtenir le mois. Cela fonctionne également avec MySQL.

Edit: Utilisez un RIGHT JOIN sur une table avec les numéros de mois:

CREATE TABLE months(nr tinyint); 
INSERT INTO months(nr) VALUES (1),(3),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12); 

SELECT 
    nr as month, 
    COUNT(*) as c 
FROM 
    sale_registrations 
    RIGHT JOIN months ON EXTRACT(month FROM created_at) = nr 
WHERE 
    (created_at BETWEEN '2011-01-01' AND '2011-12-31') 
GROUP BY 
    EXTRACT(month FROM created_at) 
ORDER BY 
    EXTRACT(month FROM created_at) ASC; 

Dans PostgreSQL, vous pouvez utiliser generate_series(), mais cela ne va pas travailler dans MySQL.

+0

Je sais - je montrais juste la version de MySQL. Le vrai problème est d'obtenir les mois vides. – jriff

+0

@jriff: Crée et remplit un tableau de mois ('mois int'), joins-le au résultat de cette requête (ou à gauche joint le résultat de cette requête à la table des mois). –

+0

@andriy_m: Est-ce que cela peut être fait de façon cleaver, donc je n'ai pas besoin d'une table supplémentaire? – jriff

Questions connexes