mysql中某列的滚动求和

mysql中某列的滚动求和,mysql,sql,Mysql,Sql,我想得到以下样本数据的增长列的滚动总和,可以在这里找到 输出应该如下所示: Growth RollingSum TMonth TYear 511 511 AUG 2019 79 590 SEP 2019 -6 584 OCT 2019 0 584 NOV 2019 -4 580 DEC 2019 45 625

我想得到以下样本数据的增长列的滚动总和,可以在这里找到

输出应该如下所示:

Growth  RollingSum  TMonth  TYear
511       511       AUG     2019
79        590       SEP     2019
-6        584       OCT     2019
0         584       NOV     2019
-4        580       DEC     2019
45        625       JAN     2020
-1        624       FEB     2020
7         631       MAR     2020
-22       609       APR     2020
-6        603       MAY     2020
-20       583       JUN     2020
0         583       JUL     2020
我的尝试如下。我只得到增长列中值的总数

上面给出的结果是

Growth  RollingSum  TMonth  TYear
511      583         AUG    2019
79       583         SEP    2019
-6       583         OCT    2019
0        583         NOV    2019
-4       583         DEC    2019
45       583         JAN    2020
-1       583         FEB    2020
7        583         MAR    2020
-22      583         APR    2020
-6       583         MAY    2020
-20      583         JUN    2020
0        583         JUL    2020

我希望尽可能避免使用过程、游标或函数。我使用的是mysql 8.0.17,因为您使用的是mysql 8 use n SUM

DATE\u FOMAT不起作用,因此您需要STR\u TO\u DATE

生长期 -----: | ---------: | :----- | ----: 2019年8月 2019年9月79日| 590日| -2019年10月6日 2019年11月0日| 584日| -4 | 580 | 2019年12月| 45 | 625 | 2020年1月| -1 | 624 | 2020年2月| 2020年3月7日 -2020年4月22日| 609日| -6 | 603 | 2020年5月| -2020年6月20日 0 | 583 | 2020年7月|
dbfiddle

使用我从中获取的值和名称,此交叉连接将为您提供更简单的输出:

select r1.Growth, r1.TMonth, TYear,
(@s := @s + r1.Growth) as RollingSum
from Report r1 cross join
    (select @s := 0) p;

您可以使用
SUM()
窗口函数,但顺序正确。
此订购:

ORDER BY DATE_FORMAT(`TMonth`, '%M'), `TYear`
是错误的,因为带有这些参数的
DATE\u FORMAT()
返回
NULL
,所以您只需按年份排序。
请参阅。
巧合的是,您得到了正确的结果。

正确的顺序是:

ORDER BY STR_TO_DATE(CONCAT(TYear, TMonth, '01'), '%Y%b%d')
所以用这个:

SELECT
  Growth,
  SUM(Growth) OVER (ORDER BY STR_TO_DATE(CONCAT(TYear, TMonth, '01'), '%Y%b%d')) RollingSum,
  TMonth,
  TYear
FROM Report 
请参阅。
结果:

select r1.Growth, r1.TMonth, TYear,
(@s := @s + r1.Growth) as RollingSum
from Report r1 cross join
    (select @s := 0) p;

ORDER BY DATE_FORMAT(`TMonth`, '%M'), `TYear`
ORDER BY STR_TO_DATE(CONCAT(TYear, TMonth, '01'), '%Y%b%d')
SELECT
  Growth,
  SUM(Growth) OVER (ORDER BY STR_TO_DATE(CONCAT(TYear, TMonth, '01'), '%Y%b%d')) RollingSum,
  TMonth,
  TYear
FROM Report 
> Growth | RollingSum | TMonth | TYear
> -----: | ---------: | :----- | ----:
>    511 |        511 | AUG    |  2019
>     79 |        590 | SEP    |  2019
>     -6 |        584 | OCT    |  2019
>      0 |        584 | NOV    |  2019
>     -4 |        580 | DEC    |  2019
>     45 |        625 | JAN    |  2020
>     -1 |        624 | FEB    |  2020
>      7 |        631 | MAR    |  2020
>    -22 |        609 | APR    |  2020
>     -6 |        603 | MAY    |  2020
>    -20 |        583 | JUN    |  2020
>      0 |        583 | JUL    |  2020