关闭

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

2875人阅读 评论(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) "语文",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;

 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:41424次
    • 积分:502
    • 等级:
    • 排名:千里之外
    • 原创:10篇
    • 转载:2篇
    • 译文:0篇
    • 评论:8条
    文章存档