sql >> Database teknologi >  >> RDS >> Mysql

Mysql-forespørgsel for at få optælling pr. måned

Hvis oprettet er et INT-felt, skal du bruge FROM_UNIXTIME funktion til at konvertere det til et datofelt, og derefter MÅNED funktion til at udtrække måneden:

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

dette vil tælle alle de rækker, der er blevet oprettet inden for de sidste 12 måneder. Bemærk venligst, at det nok er bedre også at gruppere efter ÅR:

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

Hvis du skal tælle registreringsnumrene i stedet for rækkerne, kan du bruge noget som

COUNT(registration_number)

for at springe nulværdier over, eller

COUNT(DISTINCT registration_number)

kun at tælle distinkte.

Rediger

Hvis du også skal vise måneder, der har count=0, ville jeg bruge en forespørgsel som denne, der returnerer alle måneder for det aktuelle og det foregående år:

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;

Og så ville jeg bruge en LEFT JOIN, der returnerer alle rækkerne i den første forespørgsel, og kun rækkerne i den anden forespørgsel, der matcher:

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

(bemærk venligst, at her overvejer jeg kun de sidste 12 måneder, så hvis vi er i midten af ​​april 2013 vil det tælle rækker i intervallet maj 2012 - 13. april, hvis dette ikke er den korrekte adfærd, så lad mig det vide)



  1. Sådan fungerer OCTET_LENGTH() i MariaDB

  2. Kunne ikke vælge 'OK' i mysql-apt-config [Ubuntu 14.04]

  3. Sådan rettes FEJL:kolonne c.relhasoids findes ikke i Postgres?

  4. SQL Server-triggere:DML-triggere