在MySQL中计算运行总数

在MySQL中计算运行总数

我有一个MySQL查询:


SELECT DAYOFYEAR(`date`)  AS d, COUNT(*) 

FROM  `orders` 

WHERE  `hasPaid` > 0

GROUP  BY d

ORDER  BY d

返回如下内容:


d  | COUNT(*) |

20 |  5       |

21 |  7       |

22 | 12       |

23 |  4       |

我真正想要的是在结尾的另一篇专栏文章,以显示正在运行的总数:


d  | COUNT(*) | ??? |

20 |  5       |   5 |

21 |  7       |  12 |

22 | 12       |  24 |

23 |  4       |  28 |

这个是可能的吗?


牧羊人nacy
浏览 1104回答 3
3回答

杨魅力

对于您来说,这可能是一个更简单的解决方案,可以防止数据库执行大量的查询。它只执行一个查询,然后在一次传递中对结果做一些计算。SET @runtot:=0;SELECT    q1.d,    q1.c,    (@runtot := @runtot + q1.c) AS rtFROM    (SELECT        DAYOFYEAR(`date`) AS d,        COUNT(*) AS c    FROM  `orders`     WHERE  `hasPaid` > 0     GROUP  BY d    ORDER  BY d) AS q1这将为您提供一个额外的RT(运行总计)列。不要错过顶部的set语句,以便首先初始化正在运行的ALUL变量,否则只会得到NULL值的列。

桃花长相依

SELECT&nbsp; &nbsp;&nbsp;&nbsp;DAYOFYEAR(O.`date`)&nbsp;&nbsp;AS&nbsp;d,&nbsp; &nbsp;&nbsp;&nbsp;COUNT(*), &nbsp;&nbsp;&nbsp;(select&nbsp;count(*)&nbsp;from&nbsp;`orders`&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;where&nbsp;&nbsp;DAYOFYEAR(`date`)&nbsp;<=&nbsp;d&nbsp;and&nbsp;&nbsp;&nbsp;`hasPaid`&nbsp;>&nbsp;0)FROM&nbsp;&nbsp; &nbsp;&nbsp;`orders`&nbsp;as&nbsp;OWHERE&nbsp;&nbsp; &nbsp;&nbsp;O.`hasPaid`&nbsp;>&nbsp;0GROUP&nbsp;&nbsp;BY&nbsp;dORDER&nbsp;&nbsp;BY&nbsp;d这将需要一些语法调优(我没有MySQL来测试它),但它向您展示了这个想法。子查询只需返回并将您已经包含在外部查询中的所有新内容加起来,并且它必须对每一行都这样做。看一看这个问题如何使用联接来完成相同的任务。用不断增长的数据来解决性能下降的问题:因为有最大值。一年中有366天,我假设您没有针对多年运行此查询,子查询将被评估366次。有了正确的日期索引和hasPaid标志,您就会没事的。

神不在的星期二

从MySQL 8开始,您将使用窗口函数对于这种查询:SELECT&nbsp;dayofyear(`date`)&nbsp;AS&nbsp;d,&nbsp;count(*),&nbsp;sum(count(*))&nbsp;OVER&nbsp;(ORDER&nbsp;BY&nbsp;dayofyear(`date`))FROM&nbsp;`orders`WHERE&nbsp;`hasPaid`&nbsp;>&nbsp;0GROUP&nbsp;BY&nbsp;dORDER&nbsp;BY&nbsp;d在上面的查询中,聚合函数count(*)嵌套在窗口函数中。sum(..) OVER (..),这是可能的,因为SQL中操作的逻辑顺序..如果这太让人费解,您可以很容易地使用派生表或WITH条款要更好地构造查询:WITH&nbsp;daily&nbsp;(d,&nbsp;c)&nbsp;AS&nbsp;( &nbsp;&nbsp;SELECT&nbsp;dayofyear(`date`)&nbsp;AS&nbsp;d,&nbsp;count(*) &nbsp;&nbsp;FROM&nbsp;`orders` &nbsp;&nbsp;WHERE&nbsp;`hasPaid`&nbsp;>&nbsp;0 &nbsp;&nbsp;GROUP&nbsp;BY&nbsp;d)SELECT&nbsp;d,&nbsp;c,&nbsp;sum(c)&nbsp;OVER&nbsp;(ORDER&nbsp;BY&nbsp;d)ORDER&nbsp;BY&nbsp;d
打开App,查看更多内容
随时随地看视频慕课网APP