Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Consulta Mysql para obter contagem por meses


Se for criado um campo INT, você deve usar FROM_UNIXTIME função para convertê-lo em um campo de data e, em seguida, MÊS função para extrair o mês:
SELECT Month(FROM_UNIXTIME(created)), Count(*)
FROM yourtable
WHERE FROM_UNIXTIME(created) >= CURDATE() - INTERVAL 1 YEAR
GROUP BY Month(FROM_UNIXTIME(created))

isso contará todas as linhas que foram criadas nos últimos 12 meses. Observe que provavelmente é melhor também agrupar por ANO:
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))

Se você precisar contar os números de registro em vez das linhas, poderá usar algo como
COUNT(registration_number)

para pular valores nulos ou
COUNT(DISTINCT registration_number)

contar apenas os distintos.

Editar

Se você também precisar mostrar meses que tenham count=0, eu usaria uma consulta como esta que retorna todos os meses do ano atual e do ano 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;

E então eu usaria um LEFT JOIN, que retorna todas as linhas da primeira consulta e apenas as linhas da segunda consulta que correspondem:
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

(observe que aqui estou considerando apenas os últimos 12 meses, portanto, se estivermos no meio de abril de 2013, ele contará linhas no intervalo de maio de 2012 a 13 de abril, se este não for o comportamento correto, por favor me avise)