oracle 多行转多列,求SQL语句,转多列的时候可能有空列(不连续的),具体看下图,或者有疑问我会及时回答
发布网友
发布时间:2022-08-17 18:21
我来回答
共1个回答
热心网友
时间:2023-10-13 13:32
以下是我 用动态SQL 实现 行列转换的实例 虽然不是你上面的几张表但是你可以根据我的写法 转换看看
--------------------------------------用动态SQL 实现行列转换
create table tb
(
t_name varchar2(10),
t_course varchar2(10),
t_score number
);
insert into tb values('张三','语文',73);
insert into tb values('张三','数学',83);
insert into tb values('张三','物理',93);
insert into tb values('张三','英语',63);
insert into tb values('李四','语文',74);
insert into tb values('李四','数学',84);
insert into tb values('李四','物理',94);
insert into tb values('李四','英语',64);
commit
select *from tb;
--------------
declare
t_name varchar2(10);
t_course1 number;
t_course2 number;
t_course3 number;
t_course4 number;
type c_type is ref cursor;
cur c_type;
begin
open cur for
'select t_name,
sum(case t_course when '''||'语文'||'''then t_score else 0 end),
sum(case t_course when '''||'数学'||'''then t_score else 0 end),
sum(case t_course when '''||'物理'||'''then t_score else 0 end),
sum(case t_course when '''||'英语'||'''then t_score else 0 end)
from tb group by t_name';
loop
fetch cur into t_name, t_course1 ,t_course2,t_course3,t_course4;
exit when cur%notfound;
dbms_output.put_line(t_name||'语文'||t_course1||'数学'||t_course2||'物理'||t_course3||'英语'||t_course4);
end loop;
close cur;
end;
满意请接受我的答案 并采纳 谢谢!追问自己到网上找了类似的,然后最终自己写出来了, 回答的那个是不对的, 值不是数字,不能用sum的; decode 这个才是核心,然后再wm_concat合并多行,得到最终结果 ;
当然也很感谢你的回答,虽然公布这个答案时才看到你的回答!^_^