下面是我从baidu找到的一个帖子,和我目前遇到的问题相似,
请大家帮忙,求存储过程代码
表内容:
name km cj
张三 yw 81
张三 sx 82
张三 yy 83
张三 wl 84
张三 hx 85
李四 yw 71
李四 tt 72
李四 yt 73
李四 wl 74
其中 km 是动态的,可能还有dl,sw...... 注:km中项目都是不重复的 希望得到结果:
name yw sx yy wl hx
张三 81 82 83 84 85
李四 81 82 83 84 0
请大家帮忙,求存储过程代码
表内容:
name km cj
张三 yw 81
张三 sx 82
张三 yy 83
张三 wl 84
张三 hx 85
李四 yw 71
李四 tt 72
李四 yt 73
李四 wl 74
其中 km 是动态的,可能还有dl,sw...... 注:km中项目都是不重复的 希望得到结果:
name yw sx yy wl hx
张三 81 82 83 84 85
李四 81 82 83 84 0
create or replace procedure row_to_col_func2(cur out sys_refcursor)
as
sqlstr varchar2(2000):='select name';
begin
for rs in (select distinct km from course ) loop
sqlstr:=sqlstr||chr(10)||','||'max(decode(km,'''||rs.km||''',cj,0)) '||rs.km;
end loop ;
sqlstr:=sqlstr||chr(10)||'from course group by name ' ;
open cur for sqlstr;
end row_to_col_func2;
第一类:如果K_NAME项目固定,使用DEOCDE函数
with test as(
select 3 USER_ID,'背景知识' K_NAME, 4.5 SCORE from dual union all
select 3 USER_ID,'创新能力' K_NAME, 1.5 SCORE from dual union all
select 3 USER_ID,'服务意识' K_NAME, 1 SCORE from dual union all
select 3 USER_ID,'沟通能力' K_NAME, 1 SCORE from dual union all
select 4 USER_ID,'背景知识' K_NAME, 12 SCORE from dual union all
select 4 USER_ID,'创新能力' K_NAME, 1.5 SCORE from dual union all
select 4 USER_ID,'服务意识' K_NAME, 0.5 SCORE from dual union all
select 4 USER_ID,'沟通能力' K_NAME, 0.5 SCORE from dual)
SELECT USER_ID,
SUM(decode(K_NAME, '背景知识', SCORE)) "背景知识",
SUM(decode(K_NAME, '创新能力', SCORE)) "创新能力",
SUM(decode(K_NAME, '服务意识', SCORE)) "服务意识",
SUM(decode(K_NAME, '沟通能力', SCORE)) "沟通能力"
FROM test
GROUP BY USER_ID;
第二类:如果项数不固定,使用存储过程动态SQL拼接
表结构如下:
t_fl:
lb
----
a
b
c
d
e t_sj
id lb sl
-------------
1 a 10
1 c 30
1 d 40
1 e 50
2 b 20
2 e 50 想弄出这样一个结果:
id sl_a sl_b sl_c sl_d sl_e
---------------------------------
1 10 30 40 50
2 20 50 --1、如果t_fl表行数据不定的话可以写一个存储过程
CREATE OR REPLACE PROCEDURE row2col(o OUT SYS_REFCURSOR) IS
sqlstr VARCHAR2(4000) := '';
BEGIN
FOR cc IN (SELECT lb FROM t_fl) LOOP
sqlstr := sqlstr || 'sum(decode(lb,''' || cc.lb ||''',sl)) as "sl_'
|| cc.lb || '",';
END LOOP;
sqlstr := 'select id,' || rtrim(sqlstr,',') || ' from t_sj group by id';
OPEN o FOR sqlstr;
END row2col;
麻烦按照我提供的信息帮我写一个可以直接用的存储过程,深表感谢!
如果可以,马上结贴,100分一分不留
信息如下:
基础数据:
单位名称 期间 项目 金额
a 2011-01-31 xy 1000
a 2011-01-31 xx 500
a 2011-02-28 cc 700
a 2011-03-31 jj 400
... ... ... ...实现效果:单位名称 期间 xy xx cc jj ...
a 2011-01-31 1000 500 0 0
a 2011-02-28 0 0 700 0
a 2011-03-31 0 0 0 400注:项目下没有相同的项目,但项目数据量很多,至少百个,甚至上千!
我在使用2楼代码的时候报错,提示如下:
ORA-06502 PL/SQL数字或值错误:字符串缓冲区太小
ORA-06512 在ROW_TO_COL_FUNC2,LINE6
ORA-06512 在Line 3
可能是由于项目太多了,但这些项目是必须要的,这样情况该怎么办