select 员工代码,员工姓名,部门代码,部门名称,实得工资
from (
select *,'' as 代码1 ,'' as 代码2,1 as flag from 表
union all
select '小计','','','',部门代码,部门名称,sum(实得工资),2 from 表 group by 部门代码,部门名称
union all
select '总计','','','','zz','zz',sum(实得工资),3 from 表
) aa
order by 部门代码,flag,员工代码
from (
select *,'' as 代码1 ,'' as 代码2,1 as flag from 表
union all
select '小计','','','',部门代码,部门名称,sum(实得工资),2 from 表 group by 部门代码,部门名称
union all
select '总计','','','','zz','zz',sum(实得工资),3 from 表
) aa
order by 部门代码,flag,员工代码
此题关键是怎样排序!
测试:create table t1(员工代码 char(4),员工姓名 char(8),部门代码 char(2),部门名称 varchar(10),实得工资 int)
insert t1 select '12','张三','1','财务',1000
union all select '13','李四','1','财务',1100
union all select '21','王五','2','车间',800
union all select '22','赵六','2','车间',590
union all select '31','孙麻子','3','后勤',700select 员工代码,员工姓名,
(case when 员工代码 in ('小计','总计') then '' else 部门代码 end) as 部门代码,
(case when 员工代码 in ('小计','总计') then '' else 部门名称 end) as 部门名称,
实得工资 from
(select *,1 as flag from t1
union all
select '小计','',部门代码,部门名称,sum(实得工资),2 from t1 group by 部门代码,部门名称
union all
select '总计','','','',sum(实得工资),3 from t1
) aa
order by (case when 员工代码 ='总计' then 'ZZ' else 部门代码 end),flag,员工代码员工代码 员工姓名 部门代码 部门名称 实得工资
---- -------- ---- ---------- -----------
12 张三 1 财务 1000
13 李四 1 财务 1100
小计 2100
21 王五 2 车间 800
22 赵六 2 车间 590
小计 1390
31 孙麻子 3 后勤 700
小计 700
总计 4190(所影响的行数为 9 行)
员工代码,员工姓名,部门代码,部门名称,实得工资 from 表
union
select 2 as FL,1 as FL2,
'小计' as 员工代码,'' as 员工姓名,部门代码,'' as 部门名称,
sum(实得工资) from 表
group by 部门代码
union
select 3 as FL,2 as FL2,
'总计' as 员工代码,'' as 员工姓名,'' as 部门代码,'' as 部门名称,
sum(实得工资) from 表
order by FL2,部门代码,FL结果:
FL FL2 员工代码 员工姓名 部门代码 部门名称 实得工资
---- -------- ---- ---------- -----------
1 1 12 张三 1 财务 1000
1 1 13 李四 1 财务 1100
2 1 小计 1 2100
1 1 21 王五 2 车间 800
1 1 22 赵六 2 车间 590
2 1 小计 2 1390
1 1 31 孙麻子 3 后勤 700
2 1 小计 3 700
3 2 总计 4190
select 员工姓名, 部门名称, sum(实得工资)
from t1
group by 部门名称, 员工姓名 WITH CUBE
李四 财务 1100
张三 财务 1000
NULL 财务 2100
王五 车间 800
赵六 车间 590
NULL 车间 1390
孙麻子 后勤 700
NULL 后勤 700
NULL NULL 4190
李四 NULL 1100
孙麻子 NULL 700
王五 NULL 800
张三 NULL 1000
赵六 NULL 590
select * from t1
union all
select 员工代码=case grouping(部门代码) when 1 then '总计'
else case grouping(部门名称) when 1 then '小计' end end
,'',isnull(部门代码,''),'',实得工资=sum(实得工资)
from t1
group by 部门代码,部门名称 with rollup
having grouping(部门代码)=1 or grouping(部门名称)=1
) a
order by case 部门代码 when '' then '999' else 部门代码 end ,员工代码
create table t1(员工代码 varchar(10),员工姓名 varchar(10),部门代码 varchar(10),部门名称 varchar(10),实得工资 int)
insert t1 select '12','张三','1','财务',1000
union all select '13','李四','1','财务',1100
union all select '21','王五','2','车间',800
union all select '22','赵六','2','车间',590
union all select '31','孙麻子','3','后勤',700--查询
select * from(
select * from t1
union all
select 员工代码=case grouping(部门代码) when 1 then '总计'
else case grouping(部门名称) when 1 then '小计' end end
,'',isnull(部门代码,''),'',实得工资=sum(实得工资)
from t1
group by 部门代码,部门名称 with rollup
having grouping(部门代码)=1 or grouping(部门名称)=1
) a
order by case 部门代码 when '' then '999' else 部门代码 end ,员工代码
go--删除测试
drop table t1/*--测试结果员工代码 员工姓名 部门代码 部门名称 实得工资
---------- ---------- ---------- ---------- -----------
12 张三 1 财务 1000
13 李四 1 财务 1100
小计 1 2100
21 王五 2 车间 800
22 赵六 2 车间 590
小计 2 1390
31 孙麻子 3 后勤 700
小计 3 700
总计 4190(所影响的行数为 9 行)
--*/
select 员工代码,员工姓名
,部门代码=case 部门名称 when '' then '' else 部门代码 end
,部门名称,实得工资
from(
select * from t1
union all
select 员工代码=case grouping(部门代码) when 1 then '总计'
else case grouping(部门名称) when 1 then '小计' end end
,'',isnull(部门代码,''),'',实得工资=sum(实得工资)
from t1
group by 部门代码,部门名称 with rollup
having grouping(部门代码)=1 or grouping(部门名称)=1
) a
order by case 部门代码 when '' then '99999' else 部门代码 end ,员工代码
create table t1(员工代码 varchar(10),员工姓名 varchar(10),部门代码 varchar(10),部门名称 varchar(10),实得工资 int)
insert t1 select '12','张三','1','财务',1000
union all select '13','李四','1','财务',1100
union all select '21','王五','2','车间',800
union all select '22','赵六','2','车间',590
union all select '31','孙麻子','3','后勤',700--查询
select 员工代码,员工姓名
,部门代码=case 部门名称 when '' then '' else 部门代码 end
,部门名称,实得工资
from(
select * from t1
union all
select 员工代码=case grouping(部门代码) when 1 then '总计'
else case grouping(部门名称) when 1 then '小计' end end
,'',isnull(部门代码,''),'',实得工资=sum(实得工资)
from t1
group by 部门代码,部门名称 with rollup
having grouping(部门代码)=1 or grouping(部门名称)=1
) a
order by case 部门代码 when '' then '99999' else 部门代码 end ,员工代码go--删除测试
drop table t1/*--测试结果员工代码 员工姓名 部门代码 部门名称 实得工资
---------- ---------- ---------- ---------- -----------
12 张三 1 财务 1000
13 李四 1 财务 1100
小计 2100
21 王五 2 车间 800
22 赵六 2 车间 590
小计 1390
31 孙麻子 3 后勤 700
小计 700
总计 4190(所影响的行数为 9 行)
--*/