想要的结果员工   项目1     项目2   项目3      项目4    项目5  合计
员工1 0 0 0 199 0      199 
员工2 0 0 16 16 0      32
员工3 17 18 0 0 16     51
合计     17        18      16       215       16     282           
原表记录:
员工               项目    时间
员工3          项目1 17
员工3          项目2 18
员工2          项目3 16
员工1          项目4 199
员工2          项目4 16
员工3          项目5 16   求一条SQl获取上面的上旬结果  高手指点  (只有35 分,想多给点没分)                    

解决方案 »

  1.   

    select 员工,
           sum(case when 项目='项目1' then 时间 else 0 end)项目1,
           sum(case when 项目='项目2' then 时间 else 0 end)项目2,
           sum(case when 项目='项目3' then 时间 else 0 end)项目3,
           sum(case when 项目='项目4' then 时间 else 0 end)项目4,
           sum(case when 项目='项目5' then 时间 else 0 end)项目5
    from tb
    group by 员工
      

  2.   

    if not object_id('tb') is null
    drop table tb
    Go
    Create table tb([员工] nvarchar(3),[项目] nvarchar(3),[时间] int)
    Insert tb
    select N'员工3',N'项目1',17 union all
    select N'员工3',N'项目2',18 union all
    select N'员工2',N'项目3',16 union all
    select N'员工1',N'项目4',199 union all
    select N'员工2',N'项目4',16 union all
    select N'员工3',N'项目5',16
    Go
    select 员工,
           sum(case when 项目=N'项目1' then 时间 else 0 end)项目1,
           sum(case when 项目=N'项目2' then 时间 else 0 end)项目2,
           sum(case when 项目=N'项目3' then 时间 else 0 end)项目3,
           sum(case when 项目=N'项目4' then 时间 else 0 end)项目4,
           sum(case when 项目=N'项目5' then 时间 else 0 end)项目5,
           sum([时间])合计
    from tb
    group by 员工
    union all
    select N'合计',
           sum(case when 项目=N'项目1' then 时间 else 0 end)项目1,
           sum(case when 项目=N'项目2' then 时间 else 0 end)项目2,
           sum(case when 项目=N'项目3' then 时间 else 0 end)项目3,
           sum(case when 项目=N'项目4' then 时间 else 0 end)项目4,
           sum(case when 项目=N'项目5' then 时间 else 0 end)项目5,
           sum([时间])
    from tb
    /*
    员工   项目1         项目2         项目3         项目4         项目5         合计
    ---- ----------- ----------- ----------- ----------- ----------- -----------
    员工1  0           0           0           199         0           199
    员工2  0           0           16          16          0           32
    员工3  17          18          0           0           16          51
    合计   17          18          16          215         16          282(4 row(s) affected)
    */
      

  3.   

    --> 测试数据: #ta
    if object_id('tempdb.dbo.#ta') is not null drop table #ta
    go
    create table #ta (员工 varchar(100),项目 varchar(100),时间 int)
    insert into #ta
    select '员工3','项目1',17 union all
    select '员工3','项目2',18 union all
    select '员工2','项目3',16 union all
    select '员工1','项目4',199 union all
    select '员工2','项目4',16 union all
    select '员工3','项目5',16
    select * from #ta
    declare @sql varchar(500)
    declare @sqlstr varchar(2000)
    declare @sqlcon varchar(500)
    select @sql = isnull(@sql + ',','')+项目 from #ta group by [项目]
    select @sqlcon = isnull(@sqlcon + ',','')+'isnull('+项目+',0) as ['+项目+']' from #ta group by [项目]
    set @sqlstr = 'select m.员工,'+@sqlcon+',n.总计 from 
    (select * from (select * from #ta)a pivot(max(时间) for 项目 in('+@sql+'))b) m,
    (select 员工,sum(时间)总计 from #ta group by 员工) n 
                   where m.员工=n.员工'
    exec(@sqlstr)
    员工1 0 0 0 199 0 199
    员工2 0 0 16 16 0 32
    员工3 17 18 0 0 16 51
    下面的总计谁添加一下!!!1
      

  4.   

    我来个 动态的吧,顺便把刚才的补充下
    --> 测试数据: #ta
    if object_id('tempdb.dbo.#ta') is not null drop table #ta
    go
    create table #ta (员工 varchar(100),项目 varchar(100),时间 int)
    insert into #ta
    select '员工3','项目1',17 union all
    select '员工3','项目2',18 union all
    select '员工2','项目3',16 union all
    select '员工1','项目4',199 union all
    select '员工2','项目4',16 union all
    select '员工3','项目5',16
    --select * from #ta
    declare @sql varchar(500) --交叉统计对照字符串
    declare @sqlstr varchar(2000) --执行字符串
    declare @sqlcon varchar(500) --统计列头
    declare @sqlconn varchar(500) --最后行的总计
    select @sql = isnull(@sql + ',','')+项目 from #ta group by [项目]
    select @sqlcon = isnull(@sqlcon + ',','')+'isnull('+项目+',0) as ['+项目+']' from #ta group by [项目]
    select @sqlconn = isnull(@sqlconn + ',','')+'sum(case when 项目='''+项目+''' then 时间 else 0 end) as ['+项目+']' from #ta group by [项目] 
    set @sqlstr = 'select m.员工,'+@sqlcon+',n.总计 from 
    (select * from (select * from #ta)a pivot(max(时间) for 项目 in('+@sql+'))b) m,
    (select 员工,sum(时间)总计 from #ta group by 员工) n 
                   where m.员工=n.员工
       union all
       select ''总计''员工,'+@sqlconn+',sum(时间)总计 from #ta'
    exec(@sqlstr)
    员工                                                                                                   项目1         项目2         项目3         项目4         项目5         总计
    ---------------------------------------------------------------------------------------------------- ----------- ----------- ----------- ----------- ----------- -----------
    员工1                                                                                                  0           0           0           199         0           199
    员工2                                                                                                  0           0           16          16          0           32
    员工3                                                                                                  17          18          0           0           16          51
    总计                                                                                                   17          18          16          215         16          282(4 行受影响)
      

  5.   

    不错,字段固定了的好说,我遇到另外一个情况:字段可变。原表如果不只是:项目1 项目2 项目3 项目4 项目5
    而是:项目1~项目n。
    那就不能用case语句了呀。有没有一个通杀的解决方案。???