5

可能重复:
在 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
  AND userID NOT IN $excludedUsers
GROUP BY MONTH(created) ASC

我能够返回“按月计算的用户”,但如何将运行总计作为此查询的一部分?

4

1 回答 1

6

不幸的是,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 称之为“派生表”)。我对您的查询进行了一些更改,您的 GROUP BY 有可能将 2012 年 1 月与 2013 年的 1 月组合在一起,我改变了这一点。我还添加了一个 ORDER BY 子句。

于 2012-08-22T18:45:22.423 回答