2007-09-18 12:35 1146人阅读 评论(1) 收藏 举报
最近在论坛里经常看到有朋友问这个问题,下面列举两个真实问答例子来说明 一下: 例一:
问:(贴子地址:
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) \"语文\数学\"),0) \"数学\英语\"),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;
因篇幅问题不能全部显示,请点此查看更多更全内容