小编给大家分享一下mysql如何实现每隔N行生成一个汇总行,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!



处理这种每隔N行生成一个汇总行的需求,一共有三种方式


selectwhencisnullthen'汇总'else''ends,ifnull(c,sumc)cfrom(

selectceil(id/3)l,c,nullsumc

from

(

select@id:=@id+1id,t1.*fromtt1,(select@id:=0)vars

)t2

unionall

selectceil(id/3)l,null,from

(

select@id1:=@id1+1id,t1.*fromtt1,(select@id1:=0)vars

)t3

groupbyl

)torderbyl,ifnull(c,'9999');


结果:




第二招,数字辅助表补全. 性能较好. 计算汇总行,理解稍微复杂.



先增加一个数字辅助表 nums


table(intnull)delimiter $$

procedure pCreateNumscnt)

declare sdefault;

truncatenumswhile s=intoselect;

set=+;

end;

$$

;


create(intbegin

int1table;

insertnumsswhile s2=intoselect+from;

set=*;

end;

$$

;


初始化数字辅助表


selects,ifnull(c,cc)c

from(

select

whenrnisnullthen'汇总'else''ends,

t4.c,

if(mod(t3.id,4)!=0,when@total=-1then@total:=t4.celse@total:=@total+t4.cend,@total)cc,

whenmod(t3.id,4)=0then@total:=-1elsenullend

from(

select*fromnumswhereid<=

(select(ceil(fromt)

)t3

join(

select

whenmod(@rn+1,4)=0then@rn:=@rn+2else@rn:=@rn+1endrn,

t1.*fromtt1,(select@rn:=0,@total:=0)vars

)t4on(t3.id=t4.rn)

)result;


这个理解稍微有点复杂,


第二招改进版本


selectwhenidisnullthen'汇总'else''ends,from(

select@id:=@id+1id,t1.*fromtt1,(select@id:=0)vars

)t2

groupbyceil(t2.id/3),t2.idwithrollup;



以上是“mysql如何实现每隔N行生成一个汇总行”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!