求一个动态多列合并问题,连本帖共200分!谢谢!!(SQL大人帮忙!)

lanting918 2004-07-29 10:14:20
求一个如下的SQL语句,连的是oracle数据库。不过关系应该不大吧?
一:现有表一,如下: 这里,人员基本是固定的,但是工程不固定,会每个月变化。
MEMNAME PROJECT MANHOUR (小时)
人员1 工程1 23
人1 工程2 10
人2 工程1 10
人3 工程2 15
人3 工程3 50
…… …… ……

要得到如下的表:
MEMNAME 工程一 工程2 工程3 工程4 ………… 工程N 合计时间
人员1 23 10 0 0 0 33
人员2 10 0 0 0 0 10
人员3 0 15 50 0 0 65
………………………………………………………………………………………………

希望能给出一个存储过程或者SQL语句的具体例子和简单注释,谢谢!
...全文
108 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
txlicenhe 2004-07-29
  • 打赏
  • 举报
回复
drop table table1
go
create table TABLE1(memname varchar(10), PROJECT varchar(10),manhour int)
go
insert into table1 select '人员1','工程1',23
union all select '人1','工程2',10
union all select '人2','工程1',10
union all select '人3','工程2',15
union all select '人4','工程3',50


declare @sql varchar(8000)

select @sql = ' select memname'
select @sql = @sql + ',sum(case PROJECT when '''+PROJECT+''' then manhour else 0 end) ['+PROJECT+']'
from (select distinct PROJECT from table1 ) as a
select @sql = @sql+',sum(manhour) as 合计 from table1 group by memname'

exec(@sql)
/*
memname 工程1 工程2 工程3 合计
---------- ----------- ----------- ----------- -----------
人1 0 10 0 10
人2 10 0 0 10
人3 0 15 0 15
人4 0 0 50 50
人员1 23 0 0 23
*/
skyboy0720 2004-07-29
  • 打赏
  • 举报
回复
给你个例子,你自己看看,应该明白了!

/////////////////////一个统计动态列的例子///////////////


--测试数据

create table 表abcd (name varchar(20),sub varchar(20),grade int)
insert 表abcd select '张三','语文',62
union all select '李四','数学',73
union all select '张三','数学',87
union all select '王五','英语',69
union all select '李四','英语',80

create table 表efgh (name varchar(20),commissary varchar(10))
insert 表efgh select '张三','yes'
union all select '李四','no'
union all select '王五','no'

--查询处理1

declare @sql varchar(8000)
set @sql='select b.name'
select @sql = @sql + ',isnull((select grade from 表abcd c where c.name=b.name and c.sub='''+a.sub+''' ),'''') as ' + a.sub + ' '
from (select distinct sub from [表abcd]) a
set @sql=@sql+',总分=('+'case e.commissary when '+'''yes'''+' then (select sum(grade) from 表abcd d where d.name=b.name)+10 else (select sum(grade) from 表abcd d where d.name=b.name) end)'
set @sql=@sql+' from [表abcd] b join 表efgh e on b.name=e.name group by b.name,e.commissary'
print @sql
exec (@sql)

---查询处理2


declare @sql varchar(8000)
set @sql='select b.name'
select @sql = @sql + ',(select grade from 表abcd c where c.name=b.name and c.sub='''+a.sub+''' ) as ' + a.sub + ' '
from (select distinct sub from [表abcd]) a
set @sql=@sql+',总分='+'(select sum(grade)+max(case e.commissary when ''yes''then 10 else 0 end) from 表abcd d join 表efgh e on d.name=e.name where d.name=b.name)'
set @sql=@sql+' from [表abcd] b group by b.name '
print @sql
exec (@sql)

--结果

name 数学 英语 语文 总分
李四 73 80 0 153
王五 0 69 0 69
张三 87 0 62 149
lanting918 2004-07-29
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/topic/3217/3217689.xml?temp=5.631655E-02
另一个帖子的地址。

34,590

社区成员

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

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