方法一:窗口函数 sum() over()
原始表:
运行语句:
方法二:
累计值和序号可以通过窗口函数计算得出,但窗口函数对my sql版本有限制,低版本的my sql无法使用,因此,可以用变量计算。
1、用户变量的基本运算逻辑:
在一个会话内,只需要初始化一次,之后在会话内都是对上次计算的结果再次计算(相当于是在这个会话内的全局变量)
2、mysql中,用户变量不用事前申明,直接用“@变量名”就可以使用
第一种:set @num= 1 或者 set @num:=1 ; ------------这里用set语句创建并初始化变量
第二种:select @num:=1 或者 @num:=字段名 from 表
*** 一定要定义初始值,否则每跑次数据,数据都会有变化
*** 排序会影响结果输出,因此,最好还是用order by,使数据按照自己想的排序
3、案例:求累计值
创建如下表leiji,计算val累计值(不同的month,不同的dept 计算累计值):
leij列,为累计值:
语句解释:
@val------------定义的变量
@val := 0-----------赋值变量初始值为0
@val:=A.val+@val ---------求累计和公式
案例里,第一次运算:A.dept = a ,@dept 为空,根据上面的IF公式,两者不相等,因此,@val=A.val= 11,leij列第一个值为11;
根据变量的内部运算逻辑: 在一个会话内,只需要初始化一次,之后在会话内都是对上次计算的结果再次计算。
第一次运算结果@val =11 ,因此第二次运算 @val初始值为11
第二次运算:A.dept = a,@pe_id = a,根据IF公式,两者相等,得新的@val = 11+ 21 =32,将新值存放在leij第二的位置;
依次类推,可以求出累计值。
方法三:
用到的表:
累计值计算语句:
逻辑: