sql >> Base de Datos >  >> RDS >> Mysql

MySQL agregado por mes con total acumulado

Desafortunadamente, MySQL no proporciona funciones analíticas, como lo hacen Oracle y SQL Server.

Una forma de obtener un "total acumulado" es hacer uso de una variable de usuario, algo como esto:

  SELECT t.Date
       , t.NewUsers
       , @rt := @rt + t.NewUsers AS `Running Total`
    FROM (SELECT @rt := 0) i
    JOIN (
           SELECT DATE_FORMAT(created,'%Y%m%d') AS `Date`
                , COUNT(item_id) as `NewUsers`
             FROM AP_user
            WHERE YEAR(created) > 2011
              AND user_groups = '63655'
              AND user_active = 1
              AND userID NOT IN $excludedUsers
            GROUP BY DATE_FORMAT(created,'%Y-%m')
            ORDER BY DATE_FORMAT(created,'%Y-%m') ASC
         ) t

NOTA:El comportamiento de las variables de memoria como las utilizadas anteriormente no está garantizado en este contexto. Pero si tenemos cuidado con la consulta, podemos obtener resultados repetibles y predecibles en las declaraciones SELECT. El comportamiento de las variables de memoria puede cambiar en una versión futura, lo que hace que este enfoque no funcione.

NOTA:básicamente envolví su consulta entre paréntesis y le di un alias como una vista en línea (lo que MySQL llama una "tabla derivada"). Hice algunos cambios en su consulta, su GRUPO POR tiene potencial para agrupar enero de 2012 junto con enero de 2013, cambié eso. También agregué una cláusula ORDER BY.