Mysql
 sql >> Base de données >  >> RDS >> Mysql

Requête MySQL pour obtenir le nombre de mois

Si créé est un champ INT, vous devez utiliser FROM_UNIXTIME pour le convertir en un champ de date, puis MOIS fonction pour extraire le mois :

SELECT Month(FROM_UNIXTIME(created)), Count(*)
FROM yourtable
WHERE FROM_UNIXTIME(created) >= CURDATE() - INTERVAL 1 YEAR
GROUP BY Month(FROM_UNIXTIME(created))

cela comptera toutes les lignes qui ont été créées au cours des 12 derniers mois. Veuillez noter qu'il est probablement préférable de regrouper également par ANNÉE :

SELECT Year(FROM_UNIXTIME(created)), Month(FROM_UNIXTIME(created)), Count(*)
FROM yourtable
WHERE FROM_UNIXTIME(created) >= CURDATE() - INTERVAL 1 YEAR
GROUP BY Year(FROM_UNIXTIME(created)), Month(FROM_UNIXTIME(created))

Si vous avez besoin de compter les numéros d'enregistrement au lieu des lignes, vous pouvez utiliser quelque chose comme

COUNT(registration_number)

pour ignorer les valeurs nulles, ou

COUNT(DISTINCT registration_number)

pour ne compter que les distincts.

Modifier

Si vous avez également besoin d'afficher les mois qui ont count=0, j'utiliserais une requête comme celle-ci qui renvoie tous les mois de l'année en cours et de l'année précédente :

SELECT y, m
FROM
  (SELECT YEAR(CURDATE()) y UNION ALL SELECT YEAR(CURDATE())-1) years,
  (SELECT 1 m UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4
    UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8
    UNION ALL SELECT 9 UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12) months;

Et puis j'utiliserais un LEFT JOIN, qui renvoie toutes les lignes de la première requête, et uniquement les lignes de la deuxième requête qui correspondent :

SELECT y, m, Count(yourtable.created)
FROM (
  SELECT y, m
  FROM
    (SELECT YEAR(CURDATE()) y UNION ALL SELECT YEAR(CURDATE())-1) years,
    (SELECT 1 m UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4
      UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8
      UNION ALL SELECT 9 UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12) months) ym
  LEFT JOIN yourtable
  ON ym.y = YEAR(FROM_UNIXTIME(yourtable.created))
     AND ym.m = MONTH(FROM_UNIXTIME(yourtable.created))
WHERE
  (y=YEAR(CURDATE()) AND m<=MONTH(CURDATE()))
  OR
  (y<YEAR(CURDATE()) AND m>MONTH(CURDATE()))
GROUP BY y, m

(veuillez noter qu'ici, je ne considère que les 12 derniers mois, donc si nous sommes au milieu d'avril 2013, cela comptera les lignes dans l'intervalle de mai 2012 au 13 avril, si ce n'est pas le bon comportement, veuillez me le faire savoir)