sql >> Databasteknik >  >> RDS >> Mysql

Mysql-fråga för att få räkning per månader

Om skapat är ett INT-fält bör du använda FROM_UNIXTIME funktion för att konvertera det till ett datumfält och sedan MÅNAD funktion för att extrahera månaden:

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

detta kommer att räkna alla rader som har skapats under de senaste 12 månaderna. Observera att det förmodligen är bättre att även gruppera 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))

Om du behöver räkna registreringsnumren istället för raderna kan du använda något som

COUNT(registration_number)

för att hoppa över nollvärden, eller

COUNT(DISTINCT registration_number)

att bara räkna distinkta.

Redigera

Om du också behöver visa månader som har count=0, skulle jag använda en fråga som denna som returnerar alla månader för innevarande och föregå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;

Och sedan skulle jag använda en LEFT JOIN, som returnerar alla raderna i den första frågan, och bara raderna i den andra frågan som matchar:

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

(Vänligen observera att här överväger jag bara de senaste 12 månaderna, så om vi är i mitten av april 2013 kommer det att räknas rader i intervallet maj 2012 - 13 april, om detta inte är korrekt beteende, vänligen meddela mig)



  1. PHP/MySQL - SQL-syntaxfel?

  2. Finns det ett alternativ till TOP i MySQL?

  3. Uppladdning av flera bilder med Codeigniter sparar endast en sökväg till MySQL-databasen

  4. PostgreSQL:Tid för att skapa tabeller