sql >> Database >  >> RDS >> Mysql

Mysql-query om telling per maand te krijgen

Als aangemaakt een INT-veld is, moet u FROM_UNIXTIME functie om het naar een datumveld te converteren, en dan MAAND functie om de maand te extraheren:

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

hiermee worden alle rijen geteld die in de afgelopen 12 maanden zijn gemaakt. Houd er rekening mee dat het waarschijnlijk beter is om ook te groeperen op JAAR:

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

Als u de registratienummers moet tellen in plaats van de rijen, kunt u zoiets gebruiken als

COUNT(registration_number)

om null-waarden over te slaan, of

COUNT(DISTINCT registration_number)

om alleen verschillende te tellen.

Bewerken

Als u ook maanden wilt weergeven met count=0, zou ik een zoekopdracht als deze gebruiken die alle maanden voor het huidige en voor het voorgaande jaar retourneert:

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;

En dan zou ik een LEFT JOIN gebruiken, die alle rijen van de eerste query retourneert, en alleen de rijen van de tweede query die overeenkomen:

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

(merk op dat ik hier alleen de laatste 12 maanden beschouw, dus als we halverwege april 2013 zijn, worden de rijen geteld in het interval mei 2012 - 13 april, als dit niet het juiste gedrag is, laat het me dan weten)



  1. Een CSV-bestand importeren in een SQLite-tabel

  2. Hoe parallelle plannen opstarten - deel 1

  3. Oracle ORA-12154 fout op lokale IIS, maar niet met Visual Studio Development Server

  4. Vind niet-numerieke waarden in een kolom in SQL Server