小编给大家分享一下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′);
-
结果:
-
第二招,数字辅助表补全. 性能较好. 计算汇总行,理解稍微复杂.
-
先增加一个数字辅助表 nums
-
table(int null)delimiter $$
-
procedure pCreateNumscnt )
-
declare s default;
-
truncate nums while s= intoselect;
-
set=+;
-
end;
-
$$
-
;
-
create(intbegin
-
int 1 table;
-
insert nums s while s2= intoselect+from;
-
set=*;
-
end;
-
$$
-
;
初始化数字辅助表
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;
这个理解稍微有点复杂,
第二招改进版本
-
select when id is null then ‘汇总’ else ” end s,from (
-
select @id:=@id+1 id, t1.* from t t1,(select @id:=0) vars
-
) t2
-
group by ceil(t2.id/3),t2.id with rollup;
以上是“mysql如何实现每隔N行生成一个汇总行”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注云搜网行业资讯频道!