create table 派工单表
(
 合同编号 varchar(20),
 制作部位明细 varchar(50),
 制作人1  varchar(20),
 制作人1工时费 decimal(13,2),
 制作人2  varchar(20),
 制作人2工时费 decimal(13,2),
 制作人3  varchar(20),
 制作人3工时费 decimal(13,2),
 制作人4  varchar(20),
 制作人4工时费 decimal(13,2),
 制作人5  varchar(20),
 制作人5工时费 decimal(13,2),
 制作人6  varchar(20),
 制作人6工时费 decimal(13,2),
 制作人7  varchar(20),
 制作人7工时费 decimal(13,2),
 项目负责人  varchar(20),
 项目负责人工时费 decimal(13,2),
 派工日期    datetime
)
insert into 派工单表 select'HTZZ-1','割板','员工1',34,null,null,null,null,null,null,null,null,null,null,null,null,null,null,'2007-5-1'
insert into 派工单表 select'HTZZ-1','对梁','员工1',34,'员工2',34,null,null,null,null,null,null,null,null,null,null,null,null,'2007-5-1'
insert into 派工单表 select'HTZZ-1','焊合','员工1',34,'员工2',34,'员工3',50,null,null,null,null,null,null,null,null,'项目负责人1',20,'2007-5-1'insert into 派工单表 select'HTZZ-2','割板','员工1',34,null,null,null,null,null,null,null,null,null,null,null,null,null,null,'2007-5-2'
insert into 派工单表 select'HTZZ-2','对梁','员工1',34,'员工2',34,null,null,null,null,null,null,null,null,null,null,null,null,'2007-5-2'
insert into 派工单表 select'HTZZ-2','焊合','员工1',34,'员工2',34,'员工3',40,null,null,null,null,null,null,null,null,'项目负责人1',10,'2007-5-2'
select * from 派工单表
/*
要求得到这样的报表:
按照制作人或项目负责人进行统计:制作人       合同编号   割板(工时费)  对梁(工时费)  焊合(工时费)   派工日期
员工1         HTZZ-1     34            34            34          2007-5-1
员工1         HTZZ-2     34            34            34          2005-5-2
员工2         HTZZ-1     0.00          34            34          2007-5-1
员工2         HTZZ-2     0.00          34            34          2007-5-2
员工3         HTZZ-1     0.00          0.00          50          2007-5-1
员工3         HTZZ-2     0.00          0.00          40          2007-5-2
项目负责人1    HTZZ-1    0.00           0.00         20           2007-5-1
项目负责人1    HTZZ-2    0.00           0.00         10           2007-5-2
*/drop table 派工单表

解决方案 »

  1.   

    你的表设计的不是太合理吧,要统计太繁琐。譬如就一个简单的查询“员工1”的情况都有好几种情况,"制作人1='员工1' or 制作人2='员工1' or 制作人3='员工1' or ..."。 除非人员记录有固定的位置。
      

  2.   

    select 制作人1,合同编号,
    max(case 制作部位明细 when '割板' then 制作人1工时费 end) as [割板(工时费)],
    max(case 制作部位明细 when '对梁' then 制作人1工时费 end) as [对梁(工时费)],
    max(case 制作部位明细 when '焊合' then 制作人1工时费 end) as [焊合(工时费)],
    派工日期
    from 派工单表
    group by 制作人1,合同编号,派工日期union allselect 制作人2,合同编号,
    max(case 制作部位明细 when '割板' then 制作人2工时费 end) as [割板(工时费)],
    max(case 制作部位明细 when '对梁' then 制作人2工时费 end) as [对梁(工时费)],
    max(case 制作部位明细 when '焊合' then 制作人2工时费 end) as [焊合(工时费)],
    派工日期
    from 派工单表
    where 制作人2 is not null
    group by 制作人2,合同编号,派工日期union allselect 制作人3,合同编号,
    max(case 制作部位明细 when '割板' then 制作人3工时费 end) as [割板(工时费)],
    max(case 制作部位明细 when '对梁' then 制作人3工时费 end) as [对梁(工时费)],
    max(case 制作部位明细 when '焊合' then 制作人3工时费 end) as [焊合(工时费)],
    派工日期
    from 派工单表
    where 制作人3 is not null
    group by 制作人3,合同编号,派工日期....
      

  3.   


    select distinct 制作人,合同编号,sum(case  制作部位明细 when N'割板' then 工时费 else 0 end  ) as 割板,
    sum(case  制作部位明细 when N'对梁' then 工时费 else 0 end  ) as 对梁,
    sum(case  制作部位明细 when N'焊合' then 工时费 else 0 end  ) as 焊合,派工日期
    from 
    (
    select 合同编号 , 制作部位明细 , 制作人1 as 制作人 , 制作人1工时费 as  工时费 , 项目负责人  , 项目负责人工时费 , 派工日期    from 派工单表 union
    select 合同编号 , 制作部位明细 , 制作人2  , 制作人2工时费 , 项目负责人  , 项目负责人工时费 , 派工日期    from 派工单表 union
    select 合同编号 , 制作部位明细 , 制作人3  , 制作人3工时费 , 项目负责人  , 项目负责人工时费 , 派工日期    from 派工单表 union
    select 合同编号 , 制作部位明细 , 制作人4  , 制作人4工时费 , 项目负责人  , 项目负责人工时费 , 派工日期    from 派工单表 union
    select 合同编号 , 制作部位明细 , 制作人5  , 制作人5工时费 , 项目负责人  , 项目负责人工时费 , 派工日期    from 派工单表 union
    select 合同编号 , 制作部位明细 , 制作人6  , 制作人6工时费 , 项目负责人  , 项目负责人工时费 , 派工日期    from 派工单表 union
    select 合同编号 , 制作部位明细 , 制作人7  , 制作人7工时费 , 项目负责人  , 项目负责人工时费 , 派工日期    from 派工单表 union
    select 合同编号 , 制作部位明细 , 项目负责人  , 项目负责人工时费 , 项目负责人  , 项目负责人工时费 , 派工日期    from 派工单表
    ) a 
    where 制作人 is not null
    group by 制作人,合同编号,派工日期
    --result
    员工1    HTZZ-1   34.00    34.00    34.00    2007-05-01 00:00:00.000
    员工1    HTZZ-2   34.00    34.00    34.00    2007-05-02 00:00:00.000
    员工2    HTZZ-1   .00      34.00    34.00    2007-05-01 00:00:00.000
    员工2    HTZZ-2   .00      34.00    34.00    2007-05-02 00:00:00.000
    员工3    HTZZ-1   .00      .00      50.00    2007-05-01 00:00:00.000
    员工3    HTZZ-2   .00      .00      40.00    2007-05-02 00:00:00.000
    项目负责人1 HTZZ-1 .00      .00      20.00    2007-05-01 00:00:00.000
    项目负责人1 HTZZ-2 .00      .00      10.00    2007-05-02 00:00:00.000
      

  4.   

    select 制作人1,合同编号,[割板(工时费)]=sum(case when 制作部位明细='割板' then  制作人1工时费 else 0 end),
    [对梁(工时费)]=sum(case when 制作部位明细='对梁' then  制作人1工时费 else 0 end),
    [焊合(工时费)]=sum(case when 制作部位明细='焊合' then  制作人1工时费 else 0 end),convert(varchar(10),派工日期,120)
    from 派工单表 group by 合同编号,制作人1,派工日期 having 制作人1 is not null
    union all
    select 制作人2,合同编号,[割板(工时费)]=sum(case when 制作部位明细='割板' then  制作人2工时费 else 0 end),
    [对梁(工时费)]=sum(case when 制作部位明细='对梁' then  制作人2工时费 else 0 end),
    [焊合(工时费)]=sum(case when 制作部位明细='焊合' then  制作人2工时费 else 0 end),convert(varchar(10),派工日期,120)
    from 派工单表 group by 合同编号,制作人2,派工日期 having 制作人2 is not null
    union all
    select 制作人3,合同编号,[割板(工时费)]=sum(case when 制作部位明细='割板' then  制作人2工时费 else 0 end),
    [对梁(工时费)]=sum(case when 制作部位明细='对梁' then  制作人3工时费 else 0 end),
    [焊合(工时费)]=sum(case when 制作部位明细='焊合' then  制作人3工时费 else 0 end),convert(varchar(10),派工日期,120)
    from 派工单表 group by 合同编号,制作人3,派工日期 having 制作人3 is not null
    union all
    select 制作人4,合同编号,[割板(工时费)]=sum(case when 制作部位明细='割板' then  制作人2工时费 else 0 end),
    [对梁(工时费)]=sum(case when 制作部位明细='对梁' then  制作人4工时费 else 0 end),
    [焊合(工时费)]=sum(case when 制作部位明细='焊合' then  制作人4工时费 else 0 end),convert(varchar(10),派工日期,120)
    from 派工单表 group by 合同编号,制作人4,派工日期 having 制作人4 is not null
    union all
    select 制作人5,合同编号,[割板(工时费)]=sum(case when 制作部位明细='割板' then  制作人2工时费 else 0 end),
    [对梁(工时费)]=sum(case when 制作部位明细='对梁' then  制作人5工时费 else 0 end),
    [焊合(工时费)]=sum(case when 制作部位明细='焊合' then  制作人5工时费 else 0 end),convert(varchar(10),派工日期,120)
    from 派工单表 group by 合同编号,制作人5,派工日期 having 制作人5 is not null
    union all
    select 制作人6,合同编号,[割板(工时费)]=sum(case when 制作部位明细='割板' then  制作人6工时费 else 0 end),
    [对梁(工时费)]=sum(case when 制作部位明细='对梁' then  制作人6工时费 else 0 end),
    [焊合(工时费)]=sum(case when 制作部位明细='焊合' then  制作人6工时费 else 0 end),convert(varchar(10),派工日期,120)
    from 派工单表 group by 合同编号,制作人6,派工日期 having 制作人6 is not null
    union all
    select 制作人7,合同编号,[割板(工时费)]=sum(case when 制作部位明细='割板' then  制作人7工时费 else 0 end),
    [对梁(工时费)]=sum(case when 制作部位明细='对梁' then  制作人7工时费 else 0 end),
    [焊合(工时费)]=sum(case when 制作部位明细='焊合' then  制作人7工时费 else 0 end),convert(varchar(10),派工日期,120)
    from 派工单表 group by 合同编号,制作人7,派工日期 having 制作人7 is not null
    union all
    select 项目负责人,合同编号,[割板(工时费)]=sum(case when 制作部位明细='割板' then  项目负责人工时费 else 0 end),
    [对梁(工时费)]=sum(case when 制作部位明细='对梁' then  项目负责人工时费 else 0 end),
    [焊合(工时费)]=sum(case when 制作部位明细='焊合' then  项目负责人工时费 else 0 end),convert(varchar(10),派工日期,120)
    from 派工单表 group by 合同编号,项目负责人,派工日期 having  项目负责人 is not null
      

  5.   

    建個臨時表,將紀錄變成select 合同编号 , 制作部位明细, 制作人1, 制作人1工时费  from 派工单表
    union all
    select 合同编号 , 制作部位明细, 制作人2, 制作人2工时费  from 派工单表
    union all
    ....這樣統計起來就OK了,按[制作部位明细] 欄位行轉列
      

  6.   

    lwl0606(寒泉)
    就像这样的了.先改回正确的结构,再叉表回LZ想要的