wake-up-neo.com

Gruppierung nach Monat und Jahr in MySQL

Angenommen, Sie haben eine Tabelle mit einem Zeitstempel in jeder Zeile. Wie würden Sie die Abfrage formatieren, damit sie in dieses bestimmte Json-Objektformat passt.

Ich versuche, ein Json-Objekt in Jahre/Monate zu organisieren.

json, um die Abfrage zu stützen:

{
  "2009":["August","July","September"],
  "2010":["January", "February", "October"]
}

Hier ist die Frage, die ich bis jetzt habe - 

SELECT
    MONTHNAME(t.summaryDateTime) as month, YEAR(t.summaryDateTime) as year
FROM
    trading_summary t 
GROUP BY MONTH(t.summaryDateTime) DESC";

Die Abfrage bricht zusammen, weil sie (vorhersagbar) die verschiedenen Jahre zusammenfasst.

66
Derek Adair
GROUP BY YEAR(t.summaryDateTime), MONTH(t.summaryDateTime) DESC;

ist was du willst.

144
Mitch Dempsey
GROUP BY DATE_FORMAT(summaryDateTime,'%Y-%m')
54
Ferhat KOÇER
SELECT MONTHNAME(t.summaryDateTime) as month, YEAR(t.summaryDateTime) as year
FROM trading_summary t
GROUP BY YEAR(t.summaryDateTime) DESC, MONTH(t.summaryDateTime) DESC

Sollte DESC sowohl für das JAHR als auch für den Monat verwenden, um die korrekte Reihenfolge zu erhalten.

7
Sasindu H

Ich bevorzuge

SELECT
    MONTHNAME(t.summaryDateTime) as month, YEAR(t.summaryDateTime) as year
FROM
    trading_summary t 
GROUP BY EXTRACT(YEAR_MONTH FROM t.summaryDateTime) DESC";
5
John McDonnell

Ich weiß, dass dies eine alte Frage ist, aber Folgendes sollte funktionieren, wenn Sie den Monatsnamen nicht auf DB-Ebene benötigen:

  SELECT EXTRACT(YEAR_MONTH FROM summaryDateTime) summary_year_month 
    FROM trading_summary  
GROUP BY summary_year_month;

Siehe EXTRACT-Funktionsdokumente

Sie werden wahrscheinlich feststellen, dass dies eine bessere Leistung bietet. Wenn Sie ein JSON-Objekt in der Anwendungsebene erstellen, können Sie die Formatierung/Reihenfolge beim Durchlaufen der Ergebnisse vornehmen.

N.B. Ich wusste nicht, dass Sie DESC zu einer GROUP BY-Klausel in MySQL hinzufügen könnten. Vielleicht fehlt Ihnen eine ORDER BY-Klausel:

  SELECT EXTRACT(YEAR_MONTH FROM summaryDateTime) summary_year_month 
    FROM trading_summary  
GROUP BY summary_year_month
ORDER BY summary_year_month DESC;
2
Arth

Sie müssen so etwas tun 

SELECT onDay, id, 
sum(pxLow)/count(*),sum(pxLow),count(`*`),
CONCAT(YEAR(onDay),"-",MONTH(onDay)) as sdate 
FROM ... where stockParent_id =16120 group by sdate order by onDay
2
michal

verwenden Sie die EXTRACT-Funktion wie folgt

mysql> SELECT EXTRACT(YEAR FROM '2009-07-02');
       -> 2009
1
rebaimelek

Sie gruppieren sich nur nach Monat. Sie müssen YEAR () zur Gruppe hinzufügen

0
Eduardo Rascon

Sie können das auch tun

SELECT  SUM(amnt) `value`,DATE_FORMAT(dtrg,'%m-%y') AS label FROM rentpay GROUP BY YEAR(dtrg) DESC, MONTH(dtrg) DESC LIMIT 12

nach Jahr und Monat zu bestellen. Nehmen wir an, Sie möchten ab diesem Jahr und diesen Monat bis zu 12 Monate zurück bestellen

0
Niclausel
SELECT YEAR(t.summaryDateTime) as yr, GROUP_CONCAT(MONTHNAME(t.summaryDateTime)) AS month 
FROM trading_summary t GROUP BY yr

Trotzdem müssten Sie es in einem externen Skript verarbeiten, um genau die Struktur zu erhalten, nach der Sie suchen.

Verwenden Sie zum Beispiel die Explosion von PHP, um ein Array aus der Liste der Monatsnamen zu erstellen, und verwenden Sie dann json_encode ().

0
Mchl