想要的结果员工 项目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 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 分,想多给点没分)
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 员工
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)
*/
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
--> 测试数据: #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 行受影响)
而是:项目1~项目n。
那就不能用case语句了呀。有没有一个通杀的解决方案。???