Mysql
 sql >> Datenbank >  >> RDS >> Mysql

So gruppieren Sie in MySQL nach Jahr und Monat

Diese Abfrage zählt alle Zeilen und zählt auch nur die Zeilen, in denen Attribute ist nicht null, Gruppierung nach Jahr und Monat in Zeilen:

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

(Dies liegt daran, dass Count(*) alle Zeilen zählt, Count(Attribute) alle Zeilen zählt, in denen Attribut nicht null ist)

Wenn Sie Ihre Tabelle in PIVOT benötigen, können Sie dies verwenden, um nur die Zeilen zu zählen, in denen das Attribut nicht null ist:

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

Und dies, um alle Zeilen zu zählen:

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

(Oder anstatt die ID zu zählen, können Sie Sum(Month( Datum)=1) wie in Kanders Antwort). Natürlich können Sie beide Abfragen hierin kombinieren:

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