分享
 
 
 

关于竖表转横表的问题

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

关于竖表转横表的问题

本文作者:dinya

内容摘要:在开发过程,经常遇到一些将表的显示方式进行转换的需求,我们习惯性称之为竖表到横表的转换,本文通过一个例子来简要说明常见的两种竖表转横表的问题。

本文适宜读者范围:Oracle初级,中级

系统环境:

OS:windows 2000 Professional (英文版)

Oracle:8.1.7.1.0

正文:

在实际的应用中,我们经常遇到需要转换数据显示方式,比如将横表转为竖表,或将竖表转换为横表的情况,如:课程表的显示方式,部门平均工资的排名等情况。下面将将根据两个实例子的需求描述给出两种常见的竖表转横表的解决办法(本例中的数据意思是:一、二、三年级的各科目最高分统计)。

表结构:

create table test_table

(

grade_id number(8), --年级:1、一年级,2、二年级,3、三年级

subject_name varchar2(30), --科目:包含语文、数学、外语、政治等科目

max_score number(8) --最高分

)

表中数据:

SQL> select * from test_table;

GRADE_ID SUBJECT_NAME MAX_SCORE

1 语文 95

1 数学 98

2 语文 86

2 数学 90

2 政治 87

3 语文 93

3 数学 88

3 英语 88

3 政治 97

9 rows selected.

第一种转换方式:

需求描述:查看每个年级在系统中存在的科目信息,并各年级的科目信息按下面的格式显示:

GRADE_ID SUBJECT_NAME

1 语文 数学

2 语文 数学 政治

3 语文 数学 英语 政治

分析:在要求得到的结果中,每个年级的科目将变成一条记录,而且每个年级的科目是不固定的。所以考虑写个函数来解决,输入年级信息,使用游标得到该年级的所有科目信息并返回值。

1、建函数:

SQL> create or replace function test_fun(p_grade number) return varchar2 as

2 v_temp varchar2(100):='';

3 v_out varchar2(500):='';

4 cursor c is select a.subject_name from test_table a where a.grade_id=p_grade;

5 begin

6 open c ;--打开游标

7 loop

8 fetch c into v_temp;

9 exit when c%notfound;

10 v_out:=v_out||' '||v_temp;

11 end loop;

12 close c; --关闭游标

13 return v_out;

14 exception

15 when others then

16 return 'An error occured';

17 end ;

18 /

Function created.

SQL> create or replace function test_fun(p_grade number) return varchar2 as

2 v_out varchar2(500):='';

3 cursor c is select a.subject_name from test_table a where a.grade_id=p_grade;

4 begin

5 for v_temp in c loop

6 v_out:=v_out||' '||v_temp.subject_name;

7 end loop; --系统自动关闭游标

8 return v_out;

9 exception

10 when others then

11 return 'An error occured';

12 end ;

13 /

Function created.

2、调用函数得到输入结果:

SQL> select distinct a.grade_id,test_fun(a.grade_id) subject from test_table a;

GRADE_ID SUBJECT

1 语文 数学

2 语文 数学 政治

3 语文 数学 英语 政治

第二种转换方式:

需求描述:要求将表中的年级、科目及最高的信息按照下表的格式显示,如果该年级没开的课程,则其最高分用0表示:

年级 语文 数学 英语政治

一年级 95 98 0 0

二年级 86 90 0 87

三年级 93 88 88 97

分析:该需求将年级的分数及科目信息由纵向转为横向,这样就要针对每个年级的,对其科目进行判断,存在科目则显示科目的最高分,如果不存在显示0。这时候就考虑到使用decode函数来解决。实现如下:

select

decode(t.grade_id,1,'一年级',2,'二年级',3,'三年级') 年级,

sum(decode(t.subject_name,’语文’,t.max_score,0)) 语文,

sum(decode(t.subject_name,'数学',t.max_score,0)) 数学,

sum(decode(t.subject_name,'英语',t.max_score,0)) 英语,

sum(decode(t.subject_name,'政治',t.max_score,0)) 政治

from

test_table t

group by

t.grade_id

需要说明的是,在第一种转换方式中写了两个函数,两个函数实现的是同一个需求,所不同的是,两个函数中游标使用方式不同,地一个函数中手动打开游标,循环结束后要求手动关闭。而后一个函数使用for 循环,循环结束后系统自动关闭光标。在第二种转换方式中,使用了decode函数,关于decode的详细用法,请参考oracle函数相关文档。

总结:

上面的两种转换方式是在开发中经常遇到的情况,在开发中的其他类似的转换都可以参考上面的转换方式,使用decode,nvl等函数进行一些特别的处理即可得到想要的显示方式.

本文你可以在作者的Blog上找到,更多内容请登陆作者的Blog。

作者Blog: http://blog.csdn.net/dinya2003/

如转载,请保留作者Blog信息.

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有