sql >> Databáze >  >> RDS >> Mysql

Mysql dotaz pro získání počtu za měsíce

Pokud je vytvořeno pole INT, měli byste použít FROM_UNIXTIME funkci převést na datové pole a poté MĚSÍC funkce pro extrakci měsíce:

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

to bude počítat všechny řádky, které byly vytvořeny za posledních 12 měsíců. Všimněte si prosím, že je pravděpodobně lepší seskupit také podle ROKU:

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

Pokud potřebujete spočítat registrační čísla místo řádků, můžete použít něco jako

COUNT(registration_number)

pro přeskočení hodnot null nebo

COUNT(DISTINCT registration_number)

počítat pouze odlišné.

Upravit

Pokud také potřebujete zobrazit měsíce, které mají počet =0, použil bych dotaz, jako je tento, který vrátí všechny měsíce pro aktuální a předchozí rok:

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;

A pak bych použil LEFT JOIN, který vrátí všechny řádky prvního dotazu a pouze řádky druhého dotazu, které odpovídají:

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šimněte si prosím, že zde uvažuji pouze posledních 12 měsíců, takže pokud jsme v polovině dubna 2013, budou se počítat řádky v intervalu květen 2012 - 13. duben, pokud to není správné chování, dejte mi prosím vědět)



  1. Správa souborů MDF na serveru SQL Server 2019

  2. Použití MySQLi z jiné třídy v PHP

  3. Seskupte podle období v intervalu týdnů/měsíců

  4. Udělte oprávnění uživateli MySQL v systému Linux prostřednictvím příkazového řádku