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.
GROUP BY YEAR(t.summaryDateTime), MONTH(t.summaryDateTime) DESC;
c'est ce que tu veux.
GROUP BY DATE_FORMAT(summaryDateTime,'%Y-%m')
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.
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";
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;
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
utiliser la fonction EXTRACT comme ça
mysql> SELECT EXTRACT(YEAR FROM '2009-07-02');
-> 2009
Vous ne regroupez que par mois, vous devez ajouter YEAR () au groupe par
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
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 ()