Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment regrouper par année et par mois dans MySQL

Cette requête comptera toutes les lignes et ne comptera également que les lignes où Attribute n'est pas nul, regroupant par année et par mois en lignes :

SELECT
  Year(`date`),
  Month(`date`),
  Count(*) As Total_Rows,
  Count(`Attribute`) As Rows_With_Attribute
FROM your_table
GROUP BY Year(`date`), Month(`date`)

(ceci parce que Count(*) compte toutes les lignes, Count(Attribute) compte toutes les lignes où Attribute n'est pas nul)

Si vous avez besoin de votre table dans PIVOT, vous pouvez l'utiliser pour ne compter que les lignes où Attribut n'est pas nul :

SELECT
  Year(`date`),
  Count(case when month(`date`)=1 then `Attribute` end) As Jan,
  Count(case when month(`date`)=2 then `Attribute` end) As Feb,
  Count(case when month(`date`)=3 then `Attribute` end) As Mar,
  ...
FROM your_table
GROUP BY Year(`date`)

Et ceci pour compter toutes les lignes :

SELECT
  Year(`date`),
  Count(case when month(`date`)=1 then id end) As Jan,
  Count(case when month(`date`)=2 then id end) As Feb,
  Count(case when month(`date`)=3 then id end) As Mar,
  ...
FROM your_table
GROUP BY Year(`date`)

(ou, au lieu de compter l'id, vous pouvez utiliser Sum(Month( date)=1) comme dans la réponse de Kander). Bien sûr, vous pouvez combiner les deux requêtes en ceci :

SELECT
  Year(`date`),
  Count(case when month(`date`)=1 then id end) As Jan_Tot,
  Count(case when month(`date`)=1 then `Attribute` end) As Jan_Attr,
  Count(case when month(`date`)=2 then id end) As Feb_Tot,
  Count(case when month(`date`)=2 then `Attribute` end) As Feb_Attr,
  Count(case when month(`date`)=3 then id end) As Mar_Tot,
  Count(case when month(`date`)=3 then `Attribute` end) As Mar_Attr,
  ...
FROM your_table
GROUP BY Year(`date`)