关于一个常用的汇总效果的实现方法

 最近在做报表类的简单开发,有个很实用的汇总效果,但我一直没去那样实现,今天有点闲空就想研究下到底怎么能很好的实现.我用了一个很笨拙的方法勉强实现了,思路是先在SQL里查找,然后在WEB端显示。

先说下我想达到的效果:
比如有个表:
employeeid  employeename  depid   depname  salary  degree  age  remark
001           
张三                  001      IT       3000    本科   21    备注1
002            
李四                  001      IT       4000    本科   25    备注2
003            
王五                  003     招聘部       3000    本科   21    备注3
004            
老六                  003     招聘部       4000    本科   23    备注4
005            
老七                  002     财务部       5000    本科   21    备注5
006            
老八                  002     财务部       2000    本科   21    备注6
007            
老九                  002     财务部       3000    本科   21    备注7
我想经过筛选后在UI层显示为:
部门      员工号       姓名      工资      学历         年龄         备注
IT
       001            张三      3000         本科         21            备注1
IT
       002            李四      4000         本科         25            备注2
IT
       小计                                                                           2
财务部    005            老七      5000         本科         21            备注5
财务部    006            老八      2000         本科         21            备注6
财务部    007            老九      3000         本科         21            备注7
财务部    小计                                                                          3
招聘部    003            王五      3000         本科         21            备注3
招聘部    004            老六      4000         本科         23            备注4
招聘部    小计                                                                          2
总计                                                                                           7 

实现SQL如下:

create table A(employeeid varchar(10),employeename varchar(10),depid varchar(10)

       ,depname varchar(10),salary int,degree varchar(10),age int,remark varchar(10))

insert into A select '001','张三','001','IT','3000','本科','21','备注1'

insert into A select '002','李四','001','IT','4000','本科','25','备注2'

insert into A select '003','王五','003','招聘部','3000','本科','21','备注3'

insert into A select '004','老六','003','招聘部','4000','本科','23','备注4'

insert into A select '005','老七','002','财务部','5000','本科','21','备注5'

insert into A select '006','老八','002','财务部','2000','本科','21','备注6'

insert into A select '007','老九','002','财务部','3000','本科','21','备注7'

go

 

select * from

(

SELECT        CASE WHEN (GROUPING(depname) = 1) THEN '总计'

              ELSE ISNULL(depname, 'UNKNOWN') END AS depname

       ,isnull(convert(char(10),employeeid,120),'小计') as employeeid

       ,depid,employeename,salary,degree,age,remark,count(employeeid) as num

FROM A

group by depname,employeeid,depid,employeename,salary,degree,age,remark

with rollup

) B

where B.remark is not null or B.employeeid='小计'

 

go

 

drop table A

go

 

drop table A

go

 

效果如下:

/*

IT      001           001 张三       3000       本科       21    备注1     1

IT      002           001 李四       4000       本科       25    备注2     1

IT      小计          NULL     NULL     NULL     NULL     NULL     NULL     2

财务部    005           002 老七       5000       本科       21    备注5     1

财务部    006           002 老八       2000       本科       21    备注6     1

财务部    007           002 老九       3000       本科       21    备注7     1

财务部    小计          NULL     NULL     NULL     NULL     NULL     NULL     3

招聘部    003           003 王五       3000       本科       21    备注3     1

招聘部    004           003 老六       4000       本科       23    备注4     1

招聘部    小计          NULL     NULL     NULL     NULL     NULL     NULL     2

总计       小计          NULL     NULL     NULL     NULL     NULL     NULL     7

*/

效果基本上就这样,但感觉这种方法挺笨的,而且数据量一旦多了可能会慢,又没想到什么更好的方法。就当抛个砖,希望大家给出更好的方法。比如是不是可以考虑不必在SQL中就汇总成这个效果,而是筛选后在WEB端将明细表和汇总表通过datatable合并等方法。

posted @ 2007-08-03 12:33  TerryGao  阅读(511)  评论(2编辑  收藏  举报