Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL aggregato per mese con totale parziale

Sfortunatamente, MySQL non fornisce funzioni analitiche, come fanno Oracle e SQL Server.

Un modo per ottenere un "totale parziale" è utilizzare una variabile utente, qualcosa del genere:

  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:il comportamento delle variabili di memoria come quelle utilizzate sopra non è garantito in questo contesto. Ma se stiamo attenti con la query, possiamo ottenere risultati prevedibili e ripetibili nelle istruzioni SELECT. Il comportamento delle variabili di memoria potrebbe cambiare in una versione futura, rendendo questo approccio impraticabile.

NOTA:in pratica ho racchiuso la tua query tra parentesi e le ho assegnato un alias come vista in linea (quella che MySQL chiama "tabella derivata"). Ho apportato alcune modifiche alla tua query, il tuo GROUP BY ha il potenziale per raggruppare gennaio 2012 insieme a gennaio dal 2013, l'ho cambiato. Ho anche aggiunto una clausola ORDER BY.