Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como agrupar por ano e mês no MySQL


Esta consulta contará todas as linhas e também contará apenas as linhas em que Attribute não é nulo, agrupando por ano e mês em linhas:
SELECT
  Year(`date`),
  Month(`date`),
  Count(*) As Total_Rows,
  Count(`Attribute`) As Rows_With_Attribute
FROM your_table
GROUP BY Year(`date`), Month(`date`)

(isso porque Count(*) conta todas as linhas, Count(Attibute) conta todas as linhas em que Attribute não é nulo)

Se você precisar de sua tabela em PIVOT, você pode usar isso para contar apenas as linhas em que Attribute não é 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`)

E isso para contar todas as linhas:
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, em vez de contar id, você pode usar Sum(Month( data)=1) como na resposta de kander). Claro que você pode combinar ambas as consultas para isso:
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`)