您的位置:首页 > 数据库 > Oracle

关于oracle中纵向记录横向显示的问题举例说明

2007-09-18 12:35 609 查看
最近在论坛里经常看到有朋友问这个问题,下面列举两个真实问答例子来说明 一下:

例一:

问:(贴子地址:http://community.csdn.net/Expert/topic/5722/5722287.xml?temp=9.182376E-02

表如下:
ID NO Name Course Score
1 001 赵 语文 80
2 001 赵 数学 40
3 001 赵 英语 60
4 002 李 语文 50
5 002 李 数学 30
6 003 唐 语文 20
Sql语句执行结果如下:
NO Name AllCouse 总分
001 赵 语文,数学,英语 180
002 李 语文,数学 80
003 唐 语文 20

答:

如果本例中的学科数量是有限的并且是已知的,则可以使用遍历的方法,用一个sql语句来实现:

select no,name,yw||xx||yy AllCouse,"语文"+"数学"+"英语" 总分 from
(select no,name, case when 语文<>0 then '语文' end yw,case when 数学<>0 then ',数学' end xx,case when 英语<>0 then ',英语' end yy,
"语文","数学","英语" from
(select no,name ,nvl(sum("语文"),0) "语文",nvl(sum("数学"),0) "数学",nvl(sum("英语"),0) "英语"
from (select no,name,
case when Course='语文' then nvl(SUM(score),0) end "语文",
case when Course='数学' then nvl(SUM(score),0) end "数学",
case when Course='英语' then nvl(SUM(score),0) end "英语"

from lht_test
group by no,name,course) t
group by no,name) tt) ttt

例二:

问:(贴子地址:http://community.csdn.net/Expert/topic/5762/5762748.xml?temp=7.850283E-02

table1(id varchar2(10), name varchar2(10))

id name
1 aa
1 bb
1 cc
2 xx
3 yy
3 zz
...

想得到一个结果集如下:
id names
1 aa+bb+cc
2 xx
3 yy+zz
...

答:

这种情况中,name的值是不可预知的,则只能通过存储过程来返回一个记录集来实现:

先定义一个记录集的type,
create or replace type t_name as object
(
Id number(10),
Name varchar2(20),
);
create or replace type t_tab_names as table
of t_name;

create or replace procedure p_test (p_tTab_names out t_tab_names) as
i number;
flag number;
vtemp varchar2(100);
tname t_name;
begin
i:=0;
p_tTab_names:=new t_tab_names();
for v in (select id from table1 group by id) loop
i:=i+1;
flag:=0;
for vv in (select id,name from table1 where id=v.id) loop
if (flag=0) then
vtemp:=vv.name;
else
vtemp:=vtemp||'+'||vv.name;
end if;
flag:=1;
end loop;

tname.id:=v.id;
tname.name:=vtemp;
p_tTab_names.extend;
p_tTab_names(i):=tname;
end loop;

exception when others then
dbms_output.put_line(sqlerrm);

end p_test;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: