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

Query MySQL per ottenere il conteggio per mesi

Se creato è un campo INT, dovresti usare FROM_UNIXTIME funzione per convertirlo in un campo data, quindi MESE funzione per estrarre il mese:

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

questo conterà tutte le righe che sono state create negli ultimi 12 mesi. Tieni presente che probabilmente è meglio raggruppare anche per ANNO:

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 hai bisogno di contare i numeri di registrazione invece delle righe, potresti usare qualcosa come

COUNT(registration_number)

per saltare i valori null o

COUNT(DISTINCT registration_number)

per contare solo quelli distinti.

Modifica

Se devi mostrare anche i mesi con conteggio=0, userei una query come questa che restituisce tutti i mesi per l'anno corrente e per l'anno precedente:

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 poi userei un LEFT JOIN, che restituisce tutte le righe della prima query e solo le righe della seconda query che corrispondono:

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

(si noti che qui sto considerando solo gli ultimi 12 mesi, quindi se siamo a metà aprile 2013 conterà le righe nell'intervallo maggio 2012 - 13 aprile, se questo non è il comportamento corretto fatemelo sapere)