sql >> Base de Datos >  >> RDS >> Mysql

Cómo agrupar por año y mes en MySQL

Esta consulta contará todas las filas y también contará solo las filas donde Attribute no es nulo, agrupando por año y mes en filas:

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

(esto porque Count(*) cuenta todas las filas, Count(Attibute) cuenta todas las filas donde Attribute no es nulo)

Si necesita su tabla en PIVOT, puede usar esto para contar solo las filas donde el atributo no es nulo:

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

Y esto para contar todas las filas:

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

(o, en lugar de contar la identificación, puede usar Sum(Month( fecha)=1) como en la respuesta de kander). Por supuesto, puede combinar ambas consultas en esto:

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