Mysql
 sql >> Database >  >> RDS >> Mysql

Come raggruppare per anno e mese in MySQL

Questa query conteggerà tutte le righe e conterà anche solo le righe in cui Attribute non è nullo, raggruppando per anno e mese in righe:

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

(questo perché Count(*) conta tutte le righe, Count(Attibute) conta tutte le righe in cui Attribute non è nullo)

Se hai bisogno della tua tabella in PIVOT, puoi usarlo per contare solo le righe in cui Attribute non è nullo:

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 questo per contare tutte le righe:

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

(oppure, invece di contare l'id, puoi usare Sum(Month( data)=1) come nella risposta di Kander). Ovviamente puoi combinare entrambe le query in questo:

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