表:T1
字段:TID,YEAR表:T2
字段:TID,MONTH,TYPE
说明:TID,MONTH为1-12,TYPE为A或B数据如下:
TID MONTH TYPE
1 3 A
1 6 B
1 10 A
2 2 A
2 7 B
2 9 A希望按照YEAR输出结果如下:
TID JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC
1 A B A
2 A B A
字段:TID,YEAR表:T2
字段:TID,MONTH,TYPE
说明:TID,MONTH为1-12,TYPE为A或B数据如下:
TID MONTH TYPE
1 3 A
1 6 B
1 10 A
2 2 A
2 7 B
2 9 A希望按照YEAR输出结果如下:
TID JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC
1 A B A
2 A B A
解决方案 »
- 一个扫qlplus调用存储过程(带参数)的问题
- 提取的列值别截断!SOS···
- 还原了一个WE8ISO8859P1字符集 数据库 表里汉字都是乱码显示 如何才能看到汉字?
- 表空间备份成功后,删除表中的数据,然后恢复,发现数据丢失。why ?
- 安装oracle后修改了机器名称,OracleOraHome92TNSListener服务起不来,不将名称改回去,需要修改哪些文件?
- delete 中文问题?
- 修复方法:
- 如何从ORACLE表中导出TXT文本?
- 如何将表名,字段名作为参数
- (在线)不使用游标,能不能用简单的一条sql语句实现
- 请问sqlloader 605是什么错误?
- 测试oracle连接的问题
decode(month,2,TYPE,null) as "2月",
decode(month,3,TYPE,null) as "3月",
decode(month,4,TYPE,null) as "4月",
decode(month,5,TYPE,null) as "5月",
decode(month,6,TYPE,null) as "6月",
decode(month,7,TYPE,null) as "7月",
decode(month,8,TYPE,null) as "8月",
decode(month,9,TYPE,null) as "9月",
decode(month,10,TYPE,null) as "10月",
decode(month,11,TYPE,null) as "11",
decode(month,12,TYPE,null) as "12月"
from t2
表转换为横表的情况,如:课程表的显示方式,部门平均工资的排名等情况。下面将将根据
两个实例子的需求描述给出两种常见的竖表转横表的解决办法(本例中的数据意思是:一、
二、三年级的各科目最高分统计)。 表结构: 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
语文 数学 语文 数学 政治 语文 数学 英语 政治 第二种转换方式: 需求描述:要求将表中的年级、科目及最高的信息按照下表的格式显示,如果该年级没开
的课程,则其最高分用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
TID JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC
1 A
1 B
1 A
2 A
2 B
2 A我已经搞定了,呵呵,多谢各位的指点和提示