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

原创 2007年09月18日 12:35:00

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

例一:

问:(贴子地址: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;

 

Oracle之纵向数据转换横向数据

资源一:来源 Jason_zhu的博客 http://jason-zhu.iteye.com/blog/430647 以一张薪资表为例,表结构如下: 表结构中,每个...

oracle 将查询结果纵向横向显示。

使用max(decode())函数可以将将查询结果纵向横向显示; 例如:表 dict 编号(lxbh) 类型名称(lxmc) 101 ...

InputStream类的available()方法获取流的长度

转载请注明出处:http://my.oschina.net/smile622/blog/108863要一次读取多个字节时,经常用到InputStream.available()方法,这个方法可以在读写...
  • a_zhon
  • a_zhon
  • 2016年09月07日 17:50
  • 5079

使用left join比直接使用where速度快的原因

多表使用left join只是把主表里的所有数据查询出来,其他表只查询表中的符合条件的某一条记录,所以速度非常快;而多表使用where内联,是把所有表的数据全查出来,然后进行比对,所以速度非常慢。 ...

代码规范中常见问题举例说明

1、背景说明         虽然不止一次说明代码规范的问题,但是在协同作战的时候,代码规范这问题总是被遗忘,希望大家能够引以为戒。协同作战的时候,如果不能遵守代码规范,很容易出现各种问题,而且不知...
  • ljtyzhr
  • ljtyzhr
  • 2014年12月01日 15:35
  • 839

xaf 状态机及角色设置的举例说明

  • 2017年12月01日 09:46
  • 1.72MB
  • 下载

MessageBox用法举例说明(C#)

  • 2014年11月07日 16:27
  • 81KB
  • 下载

Oracle10G 纵向字段横向显示示例

目的:以一条记录显示学员各科目多次考试的分数 select stu,sub,ltrim(max(sys_connect_by_path(score,',')),',') score from( s...

Axure 中继器用法举例说明

  • 2017年11月13日 22:09
  • 84KB
  • 下载

JSP语法大全及举例说明.doc

  • 2015年07月09日 17:16
  • 74KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于oracle中纵向记录横向显示的问题举例说明
举报原因:
原因补充:

(最多只允许输入30个字)