2009-10-13 31 views
8

que tienen un esquema de la tabla que es esencialmente un montón de información de transacciones con un campo de fecha y hora¿Cómo puedo agrupar por mes y año cuando solo tengo un campo de fecha y hora?

TRANSACTION (<transactionid>, amount, when) 

que necesito para generar un total mensual de las transacciones, que es la suma (cantidad), pero yo perplejo por lo que hacer yo agrupar por. Cada fila de SQL debe contener el total mensual (por lo tanto, una fila para el 9 de enero, el 9 de febrero ... de enero de 2010, y así sucesivamente). Estoy pensando que debo generar la tabla por código, pero me gustaría saber si hay una forma de resolver esto usando SQL.

¡Cualquier ayuda sería apreciada! (El uso de MySQL 5.3, PHP5)

+1

solo aviso para novato, 'cuando' es el nombre de la columna de la tabla no es una función de MySQL. – GusDeCooL

Respuesta

18

Debe agrupar por extractos.

SELECT 
    SUM(amount) 
FROM 
    transaction 
GROUP BY 
    EXTRACT(MONTH FROM when), 
    EXTRACT(YEAR FROM when) 

Y si necesita esas columnas, luego

SELECT 
    EXTRACT(MONTH FROM when) as month, 
    EXTRACT(YEAR FROM when) as year, 
    SUM(amount) 
FROM 
    transaction 
GROUP BY 
    month, 
    year 

Por supuesto puede anexar ORDER BY y el uso de nombres cortos también:

SELECT 
    EXTRACT(MONTH FROM when) as month, 
    EXTRACT(YEAR FROM when) as year, 
    SUM(amount) 
FROM 
    transaction 
GROUP BY 
    month, 
    year 
ORDER BY 
    year DESC, 
    month DESC 
3

Siempre he usado MES() y el año() ... que parece un poco como un truco para mí, pero funciona ...

SELECT SUM(amount) FROM yourTable GROUP BY MONTH(date), YEAR(date) 

¿O era al revés? piensa

Bobby

5
SELECT EXTRACT(YEAR_MONTH FROM when), sum(amount) 
     FROM TRANSACTION 
    GROUP BY EXTRACT(YEAR_MONTH FROM when) 
+0

Bueno, pero no funcionará en todas las bases de datos :(. –

+4

¡la pregunta es sobre MySQL! – manji

2

me gustaría probar algo así:

SELECT 
    YEAR(when) AS year, 
    MONTH(when) AS month, 
    SUM(amount) AS amount 
FROM 
    TRANSACTION 
GROUP BY 
    YEAR(when), 
    MONTH(when) 
ORDER BY 
    YEAR(when), 
    MONTH(when) 

Esto funciona en MS SQL y debería funcionar en MySQL también.

1

Creo que desee:

SELECT SUM(amount) 
FROM yourTable 
GROUP BY CONCAT(YEAR(date), '-', MONTH(date)) 
Cuestiones relacionadas