sql >> Base de Datos >  >> RDS >> Mysql

Consulta Mysql para obtener el recuento por meses

Si se crea un campo INT, debe usar FROM_UNIXTIME para convertirlo en un campo de fecha, y luego MES función para extraer el mes:

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

esto contará todas las filas que se han creado en los últimos 12 meses. Tenga en cuenta que probablemente sea mejor agrupar también por AÑO:

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 necesita contar los números de registro en lugar de las filas, podría usar algo como

COUNT(registration_number)

para omitir valores nulos, o

COUNT(DISTINCT registration_number)

para contar solo los distintos.

Editar

Si también necesita mostrar los meses que tienen count=0, usaría una consulta como esta que devuelve todos los meses del año actual y del año anterior:

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;

Y luego usaría LEFT JOIN, que devuelve todas las filas de la primera consulta y solo las filas de la segunda consulta que coincidan con:

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

(Tenga en cuenta que aquí estoy considerando solo los últimos 12 meses, por lo que si estamos a mediados de abril de 2013, contará las filas en el intervalo de mayo de 2012 al 13 de abril, si este no es el comportamiento correcto, hágamelo saber)