Mysql
 sql >> Base de données >  >> RDS >> Mysql

Agrégat MySQL par mois avec total cumulé

Malheureusement, MySQL ne fournit pas de fonctions analytiques, contrairement à Oracle et SQL Server.

Une façon d'obtenir un "total cumulé" consiste à utiliser une variable utilisateur, quelque chose comme ceci :

  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

REMARQUE :Le comportement des variables de mémoire comme celles utilisées ci-dessus n'est pas garanti dans ce contexte. Mais si nous sommes prudents avec la requête, nous pouvons obtenir des résultats prévisibles et reproductibles dans les instructions SELECT. Le comportement des variables de mémoire peut changer dans une future version, rendant cette approche inapplicable.

REMARQUE:j'ai essentiellement mis votre requête entre parenthèses et lui ai donné un alias en tant que vue en ligne (ce que MySQL appelle une "table dérivée"). J'ai apporté quelques modifications à votre requête, votre GROUP BY a le potentiel de regrouper janvier 2012 avec janvier à partir de 2013, j'ai changé cela. J'ai également ajouté une clause ORDER BY.