Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL-Abfrage, um die Anzahl pro Monat zu erhalten

Wenn es sich bei der Erstellung um ein INT-Feld handelt, sollten Sie FROM_UNIXTIME -Funktion, um es in ein Datumsfeld umzuwandeln, und dann MONAT Funktion zum Extrahieren des Monats:

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

Dadurch werden alle Zeilen gezählt, die in den letzten 12 Monaten erstellt wurden. Bitte beachten Sie, dass es wahrscheinlich besser ist, auch nach JAHR zu gruppieren:

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))

Wenn Sie die Registrierungsnummern anstelle der Zeilen zählen müssen, können Sie so etwas wie

verwenden
COUNT(registration_number)

um Nullwerte zu überspringen, oder

COUNT(DISTINCT registration_number)

um nur einzelne zu zählen.

Bearbeiten

Wenn Sie auch Monate mit count=0 anzeigen müssen, würde ich eine Abfrage wie diese verwenden, die alle Monate für das aktuelle und für das vorherige Jahr zurückgibt:

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;

Und dann würde ich einen LEFT JOIN verwenden, der alle Zeilen der ersten Abfrage zurückgibt und nur die Zeilen der zweiten Abfrage, die übereinstimmen:

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

(Bitte beachten Sie, dass ich hier nur die letzten 12 Monate betrachte. Wenn wir uns also Mitte April 2013 befinden, werden Zeilen im Intervall von Mai 2012 bis 13. April gezählt. Wenn dies nicht das richtige Verhalten ist, lassen Sie es mich bitte wissen.) P>