MySQL按月聚合,运行总数

MySQL按月聚合,运行总数,mysql,Mysql,可能重复: 我正在按月监控自2011年以来在一个应用程序中创建的用户数量,以获取使用MySQL和PHP的图表。作为查询的一部分,我还想包括一个运行总数 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

可能重复:

我正在按月监控自2011年以来在一个应用程序中创建的用户数量,以获取使用MySQL和PHP的图表。作为查询的一部分,我还想包括一个运行总数

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 MONTH(created) ASC

我可以按月返回用户,但如何将运行总数作为查询的一部分?

不幸的是,MySQL不像Oracle和SQL Server那样提供分析功能

获取运行总数的一种方法是使用用户变量,如下所示:

  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
注意:在此上下文中,不保证上面使用的内存变量的行为。但如果我们小心处理查询,我们可以在SELECT语句中获得可预测、可重复的结果。内存变量的行为在将来的版本中可能会发生变化,这使得这种方法不可行


注意:我基本上将您的查询包装在括号中,并给它一个别名作为内联视图,MySQL称之为派生表。我对您的查询做了一些更改,您的分组有可能将2012年1月与2013年1月合并,我对此进行了更改。我还添加了ORDERBY子句。

您将需要一个子查询。将其添加到select并称之为total。选择SELECT get total here as total或in PHP只是将每个月的总数相加。我添加了以下子查询,MySQL似乎不喜欢它:选择SELECT COUNTitem_id FROM AP_user WHERE YEARcreated>2011,user_groups='63655',user_active=1,userID NOT in$excludedUsers作为'TotalUsers'创建日期',%Y%m%d'作为'DATE',从AP_user(其中YEARcreated>2011,user_groups='63655',user_active=1,userID不在$excludedUsers组中)计数项目_id为'NewUsers',由month创建,不必介意,缺少逗号…谢谢。@StephenSarcsamKamenar将其作为答案发布,以便Bill能够接受并获得声誉;然而,这只会给我一个总的总数,我需要一个运行的总数。需要,在按顺序和分组创建之后,除此之外,它工作得很好,谢谢!由于问题要求的复杂性,答案很难理解。然而伟大的作品@spencer7593。谢谢你的提问。我两个都投了赞成票。我以后会用的。我没想到它能在一个小时内解决query@SamiAkram:你是对的,它不是真的可以在一个查询中解决的,因为我的解决方案基本上是强制MySQL运行一个子查询来用MySQL的行话具体化一个内联视图或一个派生表,然后外部查询运行它。我们可以在一次选择中完成这一切,但我们实际上让MySQL为我们运行了两个查询。谢谢你的解释