MySQL按月汇总并运行总计[重复]

Posted

技术标签:

【中文标题】MySQL按月汇总并运行总计[重复]【英文标题】:MySQL aggregate by month with running total [duplicate] 【发布时间】:2012-08-22 16:32:53 【问题描述】:

可能重复:Calculate a running total in 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

我可以返回“按月计算的用户数”,但如何在此查询中包含运行总计?

【问题讨论】:

您需要一个子查询。将其添加到您的选择中并将其称为总计。 SELECT (SELECT "get total here") as total 或者在 PHP 中只是将每个月的总数相加。 我添加了以下子查询,但 MySQL 似乎不喜欢它:SELECT (SELECT COUNT(item_id) FROM AP_user WHERE YEAR(created) > 2011 AND user_groups = '63655' AND user_active = 1 AND userID NOT IN $excludedUsers) as 'TotalUsers' 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 没关系,少了一个逗号……谢谢。 @StephenSarcsamKamenar 将其作为答案发布,以便 Bill 接受并获得声誉;) 然而,这只是给了我总的总数,我需要一个 running 的总数。 【参考方案1】:

不幸的是,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 子句。

【讨论】:

Need "," 在 Order 和 Group By 部分中的“created”之后,但除此之外它工作得很好,谢谢! 由于问题的复杂性,要​​求答案很难理解。然而伟大的工作@ spencer7593。也感谢提问。我对两者都投了赞成票。我将来会使用它。我没想到它可以在单个查询中解决 @Sami Akram:你是对的,它在“单一查询”中并不能真正解决,因为我的解决方案基本上是强制 MySQL 运行子查询来实现内联视图(或“派生表” " 在 MySQL 术语中),然后外部查询针对它运行。我们可以在一个 SELECT 中完成所有操作,但我们(有效地)导致 MySQL 为我们运行两个查询。 正确的斯宾塞。谢谢解释

以上是关于MySQL按月汇总并运行总计[重复]的主要内容,如果未能解决你的问题,请参考以下文章

按月分组的运行计数以汇总销售额

多个度量的运行总计

使用汇总(或行总计)进行 SQL 透视

创建一个计算每月总收入的 PL/SQL 过程。总计必须按月打印

R中的汇总列总计[重复]

如何在 MySQL 中汇总表以获得基于几列的 3 个月平均收入?