mysql 合计 小计_用SQL实现统计报表中的"小计"与"合计"的方法详解

本文详细介绍了如何使用SQL通过临时表方法实现统计报表中的小计和合计功能。针对客户需求,作者比较了GROUPING和ROLLUP、游标以及临时表三种方法,并最终选择了执行效率高的临时表方案。示例代码展示了如何创建和操作临时表,以在原始数据基础上添加小计和合计行。
摘要由CSDN通过智能技术生成

本篇文章是对使用SQL实现统计报表中的"小计"与"合计"的方法进行了详细的分析介绍,需要的朋友参考下

客户提出需求,针对某一列分组加上小计,合计汇总。网上找了一些有关SQL加合计的语句。都不是很理想。决定自己动手写。

思路有三个:1.很多用GROUPPING和ROLLUP来实现。  优点:实现代码简洁,要求对GROUPPING和ROLLUP很深的理解。

缺点:低版本的Sql Server不支持。

2.游标实现。  优点:思路逻辑简洁。

缺点:复杂和低效。

3.利用临时表。  优点:思路逻辑简洁,执行效率高。SQL实现简单。

缺点:数据量大时耗用内存.

综合三种情况,决定“利用临时表”实现。

实现效果原始表TB

8e09d40b323bb9e8abad8b7ed2f79da3.gif

加上小计,合计后效果

e3bff329ae5ea167195ad0b1c9613af4.gif

SQL语句

复制代码 代码如下:

select * into #TB from TB

select * into #TB1 from #TB where 1<>1

select distinct zcxt into #TBype from #TB order by zcxt

select identity(int,1,1)  fid,zcxt into #TBype1 from #TBype

DECLARE @i int

DECLARE @k int

select @i=COUNT(*) from #TBype

set @k=0

DECLARE @strfname varchar(50)

WHILE @k < @i

BEGIN

Set @k =@k +1

select @strfname=zcxt from #TBype1 where fid =@k

set IDENTITY_INSERT #TB1 ON

insert into #TB1(fid,qldid,fa_cardid,ztbz,fa_name,model,i_number,gzrq,zcyz,ljzj,jz,sybm,zcxt,fa_ljjzzb)

select fid,qldid,fa_cardid,ztbz,fa_name,model,i_number,gzrq,zcyz,ljzj,jz,sybm,zcxt,fa_ljjzzb from

(

select * from #TB where zcxt=@strfname

union all

select 0 fid,'' qldid,'' fa_cardid,'' ztbz,'小计' fa_name,''

model,sum(i_number) as i_number,'' gzrq,sum(CAST(zcyz as money)) as

zcyz,sum(CAST(ljzj as money)) as ljzj,sum(CAST(jz as money)) as jz,''

sybm,'' zcxt,Sum(fa_ljjzzb) as fa_ljjzzb

from #TB where zcxt=@strfname

group by ztbz

) as B

set IDENTITY_INSERT #TB1 off

END

select qldid,fa_cardid,zcxt,fa_name,model,i_number,gzrq,zcyz,ljzj,jz,sybm,ztbz,fa_ljjzzb from #TB1

union all

select

'' qldid,'' fa_cardid,'' ztbz,'合计' fa_name,'' model,sum(i_number) as

i_number,'' gzrq,sum(CAST(zcyz as money)) as zcyz,sum(CAST(ljzj as

money)) as ljzj,sum(CAST(jz as money)) as jz,'' sybm,''

zcxt,Sum(fa_ljjzzb) as fa_ljjzzb

from #TB

drop table #TB1

drop table #TBype1

drop table #TBype

drop table #TB

扩展改进可以改写成一个通用的添加合计小计的存储过程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值