求SQL 高手请进

hul19830820 2010-12-24 09:39:28
想要的结果

员工 项目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 分,想多给点没分)
...全文
93 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
anlianganl 2010-12-24
  • 打赏
  • 举报
回复
--> 测试数据: #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
水族杰纶 2010-12-24
  • 打赏
  • 举报
回复
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)
*/
jcx396158820 2010-12-24
  • 打赏
  • 举报
回复
1楼答案正解
billpu 2010-12-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wufeng4552 的回复:]

SQL code
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 ……
[/Quote]
pupu
水族杰纶 2010-12-24
  • 打赏
  • 举报
回复
不好意思貌似还差合计
WaterGG 2010-12-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wufeng4552 的回复:]
SQL code
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(ca……
[/Quote]uupp
水族杰纶 2010-12-24
  • 打赏
  • 举报
回复
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 员工
cyhcyhhychyc 2010-12-24
  • 打赏
  • 举报
回复
不错,字段固定了的好说,我遇到另外一个情况:字段可变。原表如果不只是:项目1 项目2 项目3 项目4 项目5
而是:项目1~项目n。
那就不能用case语句了呀。有没有一个通杀的解决方案。???
anlianganl 2010-12-24
  • 打赏
  • 举报
回复
我来个 动态的吧,顺便把刚才的补充下
--> 测试数据: #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 行受影响)

34,587

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧