客戶提出需求,針對某一列分組加上小計,合計彙總。網上找了一些有關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...