用SQL實現統計報表中的「小計」和「合計」

2021-08-26 13:34:50 字數 2115 閱讀 4353

客戶提出需求,針對某一列分組加上小計,合計彙總。網上找了一些有關sql加合計的語句。都不是很理想。決定自己動手寫。

思路有三個:

1.很多用groupping和rollup來實現。

優點實現**簡潔,要求對groupping和rollup很深的理解。

缺點:低版本的sql server不支援。

2.游標實現。

優點:思路邏輯簡潔。

缺點:複雜和低效。

3.利用臨時表。

優點:思路邏輯簡潔,執行效率高。sql實現簡單。

缺點:資料量大時耗用記憶體.

綜合三種情況,決定「利用臨時表」實現。

實現效果

原始表tb

加上小計,合計後效果

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

endselect 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

擴充套件改進

可以改寫成乙個通用的新增合計小計的儲存過程。

報表例子 用BIRT實現不規則月份統計

不規則月份統計 如果起始時間是2014 01 10,則將2014 01 10到2014 02 09作為一組,將2014 02 10到2014 03 9作為一組。如果起始時間是2014 01 31,則將2014 02 27作為一組,將2014 02 28到2014 03 30作為一組。集算器 a1 根...

教你用SQL實現統計排名

前言 在某些應用場景中,我們經常會遇到一些排名的問題,比如按成績或年齡排名。排名也有多種排名方式,如直接排名 分組排名,排名有間隔或排名無間隔等等,這篇文章將總結幾種mysql中常見的排名問題。建立測試表 create table scores tb id int auto increment pr...

用sql語句實現年齡分段統計

select case when age 10 and age 20 then 10 20 when age 21 and age 30 then 21 30 else 30 end eag layer count emps from address book group bycase when a...