首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在MySQL中计算运行合计

在MySQL中计算运行合计
EN

Stack Overflow用户
提问于 2009-03-20 01:36:10
回答 5查看 71K关注 0票数 60

我有这个MySQL查询:

代码语言:javascript
复制
SELECT DAYOFYEAR(`date`)  AS d, COUNT(*) 
FROM  `orders` 
WHERE  `hasPaid` > 0
GROUP  BY d
ORDER  BY d

它返回的内容如下所示:

代码语言:javascript
复制
d  | COUNT(*) |
20 |  5       |
21 |  7       |
22 | 12       |
23 |  4       |

我真正想要的是末尾的另一个专栏,以显示运行总数:

代码语言:javascript
复制
d  | COUNT(*) | ??? |
20 |  5       |   5 |
21 |  7       |  12 |
22 | 12       |  24 |
23 |  4       |  28 |

这个是可能的吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-08-17 22:53:26

也许对您来说这是一个更简单的解决方案,并且可以避免数据库执行大量的查询。它只执行一次查询,然后在一次遍历中对结果进行一些数学运算。

代码语言:javascript
复制
SET @runtot:=0;
SELECT
   q1.d,
   q1.c,
   (@runtot := @runtot + q1.c) AS rt
FROM
   (SELECT
       DAYOFYEAR(`date`) AS d,
       COUNT(*) AS c
    FROM  `orders`
    WHERE  `hasPaid` > 0
    GROUP  BY d
    ORDER  BY d) AS q1

这将为您提供一个额外的RT (运行总数)列。不要错过顶部的SET语句,它首先初始化正在运行的total变量,否则只会得到一列空值。

票数 117
EN

Stack Overflow用户

发布于 2009-03-20 01:47:36

代码语言:javascript
复制
SELECT 
   DAYOFYEAR(O.`date`)  AS d, 
   COUNT(*),
   (select count(*) from `orders` 
       where  DAYOFYEAR(`date`) <= d and   `hasPaid` > 0)
FROM  
  `orders` as O
WHERE  
  O.`hasPaid` > 0
GROUP  BY d
ORDER  BY d

这将需要一些语法调优(我没有使用MySQL对其进行测试),但它向您展示了想法。THe子查询只需返回并添加您已包含在外部查询中的所有新内容,并且它必须对每一行执行此操作。

看看this question,了解如何使用joins来实现同样的目的。

为了解决数据增长带来的性能下降问题:因为存在最大。一年中有366天,并且我假设您不是针对多年运行此查询,则该子查询将被计算多达366次。有了适当的日期索引和hasPaid标志,您就可以了。

票数 11
EN

Stack Overflow用户

发布于 2018-09-19 03:44:25

从MySQL 8开始,您将使用window functions进行这种查询:

代码语言:javascript
复制
SELECT dayofyear(`date`) AS d, count(*), sum(count(*)) OVER (ORDER BY dayofyear(`date`))
FROM `orders`
WHERE `hasPaid` > 0
GROUP BY d
ORDER BY d

在上面的查询中,聚合函数count(*)嵌套在窗口函数sum(..) OVER (..)中,由于logical order of operations in SQL,这是可能的。如果这太令人困惑,您可以很容易地求助于使用派生表或WITH clause来更好地构造查询:

代码语言:javascript
复制
WITH daily (d, c) AS (
  SELECT dayofyear(`date`) AS d, count(*)
  FROM `orders`
  WHERE `hasPaid` > 0
  GROUP BY d
)
SELECT d, c, sum(c) OVER (ORDER BY d)
ORDER BY d
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/664700

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档