2010-07-29 27 views
56

Dada una tabla con una marca de tiempo en cada fila, ¿cómo formatearía la consulta para que se ajuste a este formato de objeto json específico?Agrupar por mes y año en MySQL

Estoy tratando de organizar un objeto json en años/meses.

JSON para basar la consulta fuera:

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

Ésta es la consulta que tengo hasta ahora -

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

La consulta se está rompiendo porque es (previsiblemente) agrupar los diferentes años .

Respuesta

117
GROUP BY YEAR(t.summaryDateTime), MONTH(t.summaryDateTime) DESC; 

es lo que desea.

+0

esto funciona. ¡muchas gracias! –

+1

@Derek: no hay problema, me complace ayudar –

+36

+1: Otra alternativa que utiliza [DATE_FORMAT] (http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_date -format): 'DATE_FORMAT (t.summaryDateTime, '% Y-% m')' –

-2

Uso

GROUP BY year, month DESC"; 

En lugar de

GROUP BY MONTH(t.summaryDateTime) DESC"; 
+0

mismo resultado ..... –

+0

aunque parece que GRUPO POR MES (t.summaryDateTime) DESC doesn 'ordene los meses adecuadamente por alguna razón ... –

+0

uy perdón por eso. – Kyra

0

está agrupando por mes solamente, hay que añadir AÑO() para el grupo de

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

Aún así lo que se necesita para procesarla en escritura externa para obtener exactamente la estructura que estás buscando.

Por ejemplo usar PHP de explotar para crear una matriz de la lista de nombres de meses y luego usar json_encode()

2

Usted debe hacer algo como esto

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 
5
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 

Deben usar DESC para tanto AÑO como Mes para obtener el orden correcto.

1

uso función de extracción como esto

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

prefiero

SELECT 
    MONTHNAME(t.summaryDateTime) as month, YEAR(t.summaryDateTime) as year 
FROM 
    trading_summary t 
GROUP BY EXTRACT(YEAR_MONTH FROM t.summaryDateTime) DESC"; 
42
GROUP BY DATE_FORMAT(summaryDateTime,'%Y-%m') 
+1

proporciona detalles. – Parixit

+0

¡Bienvenido a StackOverflow! Esta es una pregunta vieja y ya respondida. Nos complacerá si pudieras contribuir con preguntas más urgentes también. Puede encontrar sugerencias para proporcionar buenas respuestas [aquí] (http://stackoverflow.com/help/how-to-answer). – Mifeet

Cuestiones relacionadas