zl程序教程

您现在的位置是:首页 >  后端

当前栏目

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

统计方法SQL 实现 详解 报表 quot 合计
2023-06-13 09:15:01 时间

客户提出需求,针对某一列分组加上小计,合计汇总。网上找了一些有关SQL加合计的语句。都不是很理想。决定自己动手写。
思路有三个:
1.很多用GROUPPING和ROLLUP来实现。
 优点:实现代码简洁,要求对GROUPPING和ROLLUP很深的理解。
 缺点:低版本的SqlServer不支持。

2.游标实现。
 优点:思路逻辑简洁。
 缺点:复杂和低效。

3.利用临时表。
 优点:思路逻辑简洁,执行效率高。SQL实现简单。
 缺点:数据量大时耗用内存.

综合三种情况,决定“利用临时表”实现。
实现效果
原始表TB

加上小计,合计后效果

SQL语句

复制代码代码如下:

select*into#TBfromTB
select*into#TB1from#TBwhere1<>1
selectdistinctzcxtinto#TBypefrom#TBorderbyzcxt
selectidentity(int,1,1) fid,zcxtinto#TBype1from#TBype
DECLARE@iint
DECLARE@kint

 select@i=COUNT(*)from#TBype
 set@k=0
 DECLARE@strfnamevarchar(50)
 WHILE@k<@i
 BEGIN
  Set@k=@k+1
  select@strfname=zcxtfrom#TBype1wherefid=@k
  setIDENTITY_INSERT#TB1ON
     insertinto#TB1(fid,qldid,fa_cardid,ztbz,fa_name,model,i_number,gzrq,zcyz,ljzj,jz,sybm,zcxt,fa_ljjzzb)
      selectfid,qldid,fa_cardid,ztbz,fa_name,model,i_number,gzrq,zcyz,ljzj,jz,sybm,zcxt,fa_ljjzzbfrom
     (
  select*from#TBwherezcxt=@strfname
  unionall
        select0fid,""qldid,""fa_cardid,""ztbz,"小计"fa_name,""model,sum(i_number)asi_number,""gzrq,sum(CAST(zcyzasmoney))aszcyz,sum(CAST(ljzjasmoney))asljzj,sum(CAST(jzasmoney))asjz,""sybm,""zcxt,Sum(fa_ljjzzb)asfa_ljjzzb
  from#TBwherezcxt=@strfname
  groupbyztbz
 )asB
 setIDENTITY_INSERT#TB1off
 END
selectqldid,fa_cardid,zcxt,fa_name,model,i_number,gzrq,zcyz,ljzj,jz,sybm,ztbz,fa_ljjzzbfrom#TB1
unionall
select""qldid,""fa_cardid,""ztbz,"合计"fa_name,""model,sum(i_number)asi_number,""gzrq,sum(CAST(zcyzasmoney))aszcyz,sum(CAST(ljzjasmoney))asljzj,sum(CAST(jzasmoney))asjz,""sybm,""zcxt,Sum(fa_ljjzzb)asfa_ljjzzb
from#TB
droptable#TB1
droptable#TBype1
droptable#TBype
droptable#TB

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