web-dev-qa-db-fra.com

Grouper par mois et année dans MySQL

Avec un tableau avec un horodatage sur chaque ligne, comment formateriez-vous la requête pour qu'elle tienne dans ce format d'objet Json spécifique.

J'essaie d'organiser un objet JSON en années/mois.

jSON pour baser la requête:

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

Voici la requête que j'ai jusqu'à présent - 

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

La requête est en train de s'effondrer car elle regroupe (de manière prévisible) les différentes années.

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

c'est ce que tu veux.

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

Devrait utiliser DESC pour ANNÉE et Mois pour obtenir le bon ordre.

7
Sasindu H

Je préfère

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

Je sais que c’est une vieille question, mais ce qui suit devrait fonctionner si vous n’avez pas besoin du nom du mois au niveau de la base de données:

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

Voir la documentation de la fonction EXTRACT

Cela sera probablement plus performant. Si vous construisez un objet JSON dans la couche d'application, vous pouvez effectuer le formatage/la commande au fur et à mesure de l'analyse des résultats.

N.B. Je ne savais pas que vous pouviez ajouter DESC à une clause GROUP BY dans MySQL, il vous manque peut-être une clause ORDER BY:

  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

Tu dois faire quelque chose comme ça 

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

utiliser la fonction EXTRACT comme ça

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

Vous ne regroupez que par mois, vous devez ajouter YEAR () au groupe par

0
Eduardo Rascon

Tu peux aussi faire ça

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

commander par année et par mois. Disons que vous voulez commander à partir de cette année et de ce mois jusqu'à 12 mois

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

Néanmoins, vous auriez besoin de le traiter dans un script externe pour obtenir exactement la structure que vous recherchez.

Par exemple, utilisez PHP explode pour créer un tableau à partir de la liste des noms de mois, puis utilisez json_encode ()

0
Mchl