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,员工代码

解决方案 »

  1.   

    同意 txlicenhe(马可)
    此题关键是怎样排序!
      

  2.   

    改一下
    测试: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 行)
      

  3.   

    select 1 as FL,1 as FL2,
    员工代码,员工姓名,部门代码,部门名称,实得工资 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
      

  4.   

    用 CUBE 汇总数据,具体操作查帮助文件。
      

  5.   


    select 员工姓名, 部门名称, sum(实得工资)
    from t1
    group by  部门名称, 员工姓名 WITH CUBE
      

  6.   

    运行结果:
    李四     财务 1100
    张三     财务 1000
    NULL 财务 2100
    王五     车间 800
    赵六     车间 590
    NULL 车间 1390
    孙麻子   后勤 700
    NULL 后勤 700
    NULL NULL 4190
    李四     NULL 1100
    孙麻子   NULL 700
    王五     NULL 800
    张三     NULL 1000
    赵六     NULL 590
      

  7.   

    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 ,员工代码
      

  8.   

    --下面是数据测试--测试数据
    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 行)
    --*/
      

  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 ,员工代码
      

  10.   

    --再次测试--测试数据
    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 行)
    --*/