java数据横转竖_关于竖表转横表的问题

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

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

系统环境:

OS:windows 2000 Professional (英文版)

Oracle:8.1.7.1.0

正文:

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

表结构:

createtable test_table

(

grade_id number(8),--年级:1、一年级,2、二年级,3、三年级subject_name varchar2(30),--科目:包含语文、数学、外语、政治等科目max_score number(8)--最高分)

表中数据:

SQL> select * from test_table;

GRADE_IDSUBJECT_NAMEMAX_SCORE

1语文95

1数学98

2语文86

2数学90

2政治87

3语文93

3数学88

3英语88

3政治97

9 rows selected.

第一种转换方式:

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

GRADE_IDSUBJECT_NAME

1语文数学

2语文数学政治

3语文数学英语政治

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

1、建函数:

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

2v_temp varchar2(100):='';

3v_out varchar2(500):='';

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

5begin

6open c ;--打开游标

7loop

8fetch c into v_temp;

9exit when c%notfound;

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

11end loop;

12close c;--关闭游标

13return v_out;

14exception

15when others then

16return 'An error occured';

17end ;

18/

Function created.

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

2v_out varchar2(500):='';

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

4begin

5for v_temp in c loop

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

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

8return v_out;

9exception

10when others then

11return 'An error occured';

12end ;

13/

Function created.

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

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

GRADE_IDSUBJECT

1语文数学

2语文数学政治

3语文数学英语政治

第二种转换方式:

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

年级语文数学英语      政治

一年级959800

二年级8690087

三年级93888897

分析:该需求将年级的分数及科目信息由纵向转为横向,这样就要针对每个年级的,对其科目进行判断,存在科目则显示科目的最高分,如果不存在显示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:  [url]http://blog.csdn.net/dinya2003/[/url]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值