sql >> Databasteknik >  >> RDS >> Mysql

MySQL sammanställs per månad med löpande total

Tyvärr tillhandahåller MySQL inte analytiska funktioner, som Oracle och SQL Server gör.

Ett sätt att få en "running summa" är att använda en användarvariabel, ungefär så här:

  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

OBS:Uppförandet av minnesvariabler som används ovan är inte garanterat i detta sammanhang. Men om vi är försiktiga med frågan kan vi få förutsägbara, repeterbara resultat i SELECT-satser. Beteendet för minnesvariabler kan ändras i en framtida version, vilket gör detta tillvägagångssätt omöjligt.

OBS:Jag slog i princip in din fråga inom parentes och gav den ett alias som en inline-vy (vad MySQL kallar en "derived table"). Jag gjorde några ändringar i din fråga, din GROUP BY har potential att gruppera januari 2012 tillsammans med januari från 2013, jag ändrade det. Jag har också lagt till en ORDER BY-klausul.




  1. Generisk Ruby-lösning för SQLite3 LIKE eller PostgreSQL ILIKE?

  2. MySQL MATCH fungerar inte med två karaktärer?

  3. Hur man trimmar en sträng i SQLite

  4. pymssql.OperationalError:DB-Lib felmeddelande 20009, allvarlighetsgrad 9