常用的汇总效果的实现方法
先说下我想达到的效果:
比如有个表:
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')
,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合并等方法。