关于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;
例一:
问:(贴子地址: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;
相关文章推荐
- 关于Ubuntu中使用pyplot画图不能显示问题的解决方案记录
- 关于MyEclipse SVN显示资源历史记录乱码问题
- 关于 HorizontalScrollView 横向滚动,显示不全问题。
- 关于RDLC打印时自主选择横向纵向打印的一些问题
- DataTable纵向记录转换成横向列显示,动态新增列及填充数据
- DataTable纵向记录转换成横向列显示,动态新增列及填充数据
- TreePanel的横向和纵向滚动条在IE6不显示问题
- 【转】关于MyEclipse SVN显示资源历史记录乱码问题
- 关于MyEclipse SVN显示资源历史记录乱码问题
- 关于JFreeChart横向柱状图如何将数值显示到柱子顶端的问题
- Linux下oracle插入(导入)中文记录显示为问号问题及解决办法
- 举例说明关于android编程中遇到的java.lang.ClassCastException: android.app.Application问题的原因及解决办法
- 一个关于顺序显示记录的问题!!!
- 关于VC2008程序发布的问题记录说明
- 关于oracle字段到jsp前台显示验证中的长度限制问题
- 举例说明关于android的xml文件的shape中的属性android:angle取值问题的知识总结
- (2010-07-14)关于Oracle中设置缺省时间显示格式的问题
- 关于Android Menu横纵向显示的问题(经过验证)
- 关于Linux下安装Oracle时报错:out of memory的问题分析说明
- oracle 将查询结果纵向横向显示。