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