mysql如何实现每隔N行生成一个汇总行

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



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


  • select when c is null then '汇总' else '' end s,ifnull(c,sumc) c from (  

  •     select ceil(id/3) l,c,null sumc  

  •     from   

  •     (  

  •         select @id:=@id+1 id, t1.* from t t1,(select @id:=0) vars    

  •     ) t2  

  •     union all    

  •     select ceil(id/3) l,null,from   

  •     (  

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

  •     ) t3  

  •     group by l  

  • ) t order by l,ifnull(c,'9999'); 


  • 结果:


  • mysql如何实现每隔N行生成一个汇总行

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



  • 先增加一个数字辅助表 nums


  1. table(int null)delimiter $$

  2.  procedure pCreateNumscnt )

  3.     declare s default;

  4. truncate  nums    while s=        intoselect;

  5. set=+;

  6. end;

  7.  $$

  8. ;


  9. create(intbegin

  10. int  1    table;

  11. insert  nums  s    while s2=        intoselect+from;

  12. set=*;

  13. end;

  14.  $$

  15. ;


  • 初始化数字辅助表


  • select s,ifnull(c,cc) c  

  • from (    

  •     select     

  •     when rn is null then '汇总' else '' end s,     

  •     t4.c,  

  •     if(mod(t3.id,4)!=0 ,when @total=-1 then @total:=t4.c else @total:=@total+t4.c end,@total) cc,  

  •     when mod(t3.id,4)=0 then @total:=-1 else null end     

  •     from (    

  •         select * from nums where id<=    

  •         (select (ceil(from t )    

  •     ) t3    

  •     join (    

  •         select     

  •         when mod(@rn+1,4)=0 then @rn:=@rn+2 else @rn:=@rn+1 end rn ,    

  •         t1.* from t t1,(select @rn:=0,@total:=0) vars      

  •     ) t4 on(t3.id=t4.rn)    

  • ) result;    


  • 这个理解稍微有点复杂,


  • 第二招改进版本


    1. select when id is null then '汇总' else '' end s,from (  

    2.     select @id:=@id+1 id, t1.* from t t1,(select @id:=0) vars      

    3. ) t2  

    4. group by ceil(t2.id/3),t2.id with rollup;  



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