连本帖300分,求存储过程完整写法,oracle8i客户端。再不解决明天难看了!!谢过各位!

lanting918 2004-07-29 05:22:31
求一个如下的存储过程完整写法,连的是oracle8i数据库。注意:工程是可以随时增加的!!!!

一:现有表一,如下:

这里,人员基本是固定的,但是工程不固定,会每个月变化。

MEMNAME PROJECT MANHOUR (小时)
人员1 工程1 23
人1 工程2 10
人2 工程1 10
人3 工程2 15
人3 工程3 50
…… …… ……

要得到如下的表:按人group by,得出每个人在所有工程上一共花的时间总和
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
………………………………………………………………………………………………

我写了一个,但是错误百出,原来有人给写的:
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)

set @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)

希望大家帮忙!给一个完整的存储过程,解决我的难题!!!
另两个帖子的地址:
http://community.csdn.net/Expert/topic/3217/3217689.xml?temp=.5305292
http://community.csdn.net/Expert/topic/3221/3221454.xml?temp=.57008
...全文
154 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
lanting918 2004-07-30
  • 打赏
  • 举报
回复
搞定了
没有用存储过程
用了两极嵌套查询
hightech_csdn 2004-07-30
  • 打赏
  • 举报
回复
new user, test! up!
lanting918 2004-07-30
  • 打赏
  • 举报
回复
谢谢,我正在实验,最迟傍晚结帖,有好建议请继续。谢谢!!!
txlicenhe 2004-07-29
  • 打赏
  • 举报
回复
参考:

http://community.csdn.net/Expert/topic/3093/3093861.xml?temp=.5882379
oracle 如何做行列动态的交叉表
txlicenhe 2004-07-29
  • 打赏
  • 举报
回复
CREATE OR REPLACE PACKAGE pkg_test
AS
TYPE myrctype IS REF CURSOR;

PROCEDURE get (p_rc OUT myrctype);
END pkg_test;


CREATE OR REPLACE PACKAGE BODY pkg_test
AS
PROCEDURE get ( p_rc OUT myrctype)
IS

begin
declare
type proTab is table of table1.project%type;
v_project proTab;
v_sql varchar2(4000);
cursor cur is select distinct project from table1;
begin
v_sql := 'select memname';
open cur;
fetch cur bulk collect into v_project;
close cur;
for i in 1..v_project.count loop
v_sql := v_sql || ',sum(case PROJECT when '''||v_project(i)||''' then manhour else 0 end) '||v_project(i)||'';
end loop;
v_sql := v_sql || ',sum(manhour) as 合计 from table1 group by memname';
-- dbms_output.put_line(v_sql);
-- execute immediate v_sql;
open p_rc for v_sql;
end;
end;

end;
txlicenhe 2004-07-29
  • 打赏
  • 举报
回复
--测试:
create table TABLE1(memname varchar(10), PROJECT varchar(10),manhour int);

insert into table1 values( '人员1','工程1',23);
insert into table1 values( '人1','工程2',10);
insert into table1 values( '人2','工程1',10);
insert into table1 values( '人3','工程2',15);
insert into table1 values( '人4','工程3',50);

/*
写了个大概,动态SQL语句构造成功了,不过我还不太会执行它,好象要用到包才行的,暂时不太会。
*/

declare
type proTab is table of table1.project%type;
v_project proTab;
v_sql varchar2(4000);
cursor cur is select distinct project from table1;
begin
v_sql := 'select memname';
open cur;
fetch cur bulk collect into v_project;
close cur;
for i in 1..v_project.count loop
v_sql := v_sql || ',sum(case PROJECT when '''||v_project(i)||''' then manhour else 0 end) '||v_project(i)||'';
end loop;
v_sql := v_sql || ',sum(manhour) as 合计 from table1 group by memname';
dbms_output.put_line(v_sql);
-- execute immediate v_sql;
end;

/*执行结果为:
select memname,sum(case PROJECT when '工程1' then manhour else 0 end) 工程1,sum(case PROJECT when '工程2' then manhour else 0 end) 工程2,sum(case PROJECT when '工程3' then manhour else 0 end) 工程3,sum(manhour) as 合计 from table1 group by memname
*/

/*
当然如果直接把上面的运行结果复制过来执行的话,结果即为所求:
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

已选择5行。
*/
lanting918 2004-07-29
  • 打赏
  • 举报
回复
是啊,所以很麻烦。上面的应该是SQL SERVER的写法,所以才会出错的,请帮忙!!谢谢!!
dinya2003 2004-07-29
  • 打赏
  • 举报
回复
上面的过程是sql server的写法吧? 工程可以增加,那字段的个数不确定.
hzwm 2004-07-29
  • 打赏
  • 举报
回复
明天来解决
lanting918 2004-07-29
  • 打赏
  • 举报
回复
没有人看见吗?都回家了??
大家来帮忙啊!!

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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