Группировка по месяцам и годам в MySQL - PullRequest
73 голосов
/ 30 июля 2010

Учитывая таблицу с отметкой времени в каждой строке, как бы вы отформатировали запрос, чтобы соответствовать этому конкретному формату объекта json.

Я пытаюсь организовать объект json по годам / месяцам.

json для обоснования запроса:

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

Вот мой запрос на данный момент -

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

Запрос разбивается, потому что он (как и ожидалось) объединяет разные годы.

Ответы [ 11 ]

154 голосов
/ 30 июля 2010
GROUP BY YEAR(t.summaryDateTime), MONTH(t.summaryDateTime) DESC;

- это то, что вы хотите.

60 голосов
/ 14 апреля 2014
GROUP BY DATE_FORMAT(summaryDateTime,'%Y-%m')
8 голосов
/ 23 июня 2013
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

Следует использовать DESC для ГОДА и Месяца, чтобы получить правильный заказ.

5 голосов
/ 26 марта 2014

Я предпочитаю

SELECT
    MONTHNAME(t.summaryDateTime) as month, YEAR(t.summaryDateTime) as year
FROM
    trading_summary t 
GROUP BY EXTRACT(YEAR_MONTH FROM t.summaryDateTime) DESC";
4 голосов
/ 21 августа 2018

Я знаю, что это старый вопрос, но следующее должно работать, если вам не нужно название месяца на уровне БД:

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

См. ДОКУМЕНТЫ функциональных документов

Возможно, вы обнаружите, что это работает лучше ... и если вы создаете объект JSON на прикладном уровне, вы можете выполнить форматирование / упорядочение при выполнении результатов.

N.B. Я не знал, что вы можете добавить DESC к предложению GROUP BY в MySQL, возможно, вам не хватает предложения 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 голосов
/ 08 мая 2013

Вы должны сделать что-то вроде этого

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
1 голос
/ 08 декабря 2013

используйте функцию EXTRACT вот так

mysql> SELECT EXTRACT(YEAR FROM '2009-07-02');
       -> 2009
0 голосов
/ 01 августа 2018

Вы также можете сделать это

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

на заказ по году и месяцу. Допустим, вы хотите сделать заказ с этого года и с этого месяца вплоть до 12 месяцев

0 голосов
/ 30 июля 2010
SELECT YEAR(t.summaryDateTime) as yr, GROUP_CONCAT(MONTHNAME(t.summaryDateTime)) AS month 
FROM trading_summary t GROUP BY yr

Тем не менее вам нужно будет обработать его во внешнем скрипте, чтобы получить именно ту структуру, которую вы ищете.

Например, используйте PHP explode для создания массива из списка названий месяцев, а затем используйтеjson_encode ()

0 голосов
/ 30 июля 2010

Вы группируете только по месяцам, вам нужно добавить YEAR () в группу на

...