oracle实现行、列转换的方法分析

本文介绍了oracle实现行、列转换的方法,供大家参考:

1,行和列转换的固定数量的列

如:


学生成绩
---------------------------
学生的语言80
学生数学70
学生英语60
学生二语90
学生数学80
学生英语100
......




转换:


语文数学英语
学生807060
学生9080100
......




以下语句如下:


选择学生,
总和(解码(主语,语言,等级,空)) 语言
求和(解码(主语,数学,年级,空))数学
总和(解码(主语,英文,等级,空))英语
从表
学生分组;




2、不确定行和列转换

如:


C1、C2

1我
1是
1谁



......




转换


1我是谁
2知道





这种类型的转换可以在PL - sql的帮助下完成,这里是一个示例


创建或替换功能get_c2(tmp_c1号)
返回空

col_c2 VARCHAR2(4000);
开始
在对电流(选择C2从C1 = tmp_c1)环
col_c2:= col_c2 | | cur.c2;
结束循环;
col_c2:= RTrim(col_c2,1);
返回col_c2;
结束;
选择不同的C1,get_c2(C1)CC2从表;




无PL / SQL,使用分析功能和connect_by实施:


选择C1,substr(max(sys_connect_by_path(C2,';')),2)的名字
从(选择C1,C2,Rn,铅(RN)上)(按C1顺序划分)
从选择C1,C2,row_number(()在(为C2)Rn
从T)
从1是空的
由RN1 =前RN连接
C1群;




三.列的数目不是固定的(交叉表行和列转置)。

这是一个比较麻烦的问题,在PL的帮助下:

原始数据uff1a


一班的calldate callcount
1 2005-08-08 40
1 2005-08-07 6
2 2005-08-08 77
3 2005-08-09 33
3 2005-08-08 9
3 2005-08-07 21




换位后:


calldate callcount1 callcount2 callcount3
------------------------------------------
2005-08-09 0033
2005-08-08 40779
2005-08-07 6021




实验如下:

1)。建立测试表和数据


创建表T(
Class1 VARCHAR2(2字节),
calldate日期,
callcount整数
);
插入T(Class1,calldate,callcount)
值(1,to_date('08 / 08 / 2005,'mm / /年的DD),40);
插入T(Class1,calldate,callcount)
值(1,to_date('08 / 07 / 2005,'mm / /年的DD),6);
插入T(Class1,calldate,callcount)
价值观(2,to_date('08 / 08 / 2005,'mm / /年的DD),77);
插入T(Class1,calldate,callcount)
价值观(3',to_date('08 / 09 / 2005,'mm / /年的DD),33);
插入T(Class1,calldate,callcount)
价值观(3',to_date('08 / 08 / 2005,'mm / /年的DD),9);
插入T(Class1,calldate,callcount)
价值观(3',to_date('08 / 07 / 2005,'mm / /年的DD),21);
承诺;




2)。设置游标以准备输出结果集


创建包pkg_getrecord

myrctype是REFCURSOR类型;
最后pkg_getrecord;




3)。建立动态SQL交叉表函数,输出结果集


创建或替换功能fn_rs
返回pkg_getrecord.myrctype

的VARCHAR2(4000);
光标C1
选择',和(在Class1 =)
| | class1
| |然后callcount别人0端)
| | callcount ' '
| | class1
| |C2
从T
集团由一班;
R1 C1 %ROWTYPE;
list_cursor pkg_getrecord.myrctype;
开始
S:= 'select calldate;
开放的C1;

取C1到R1;
退出时未发现C1 %;
S = S r1.c2 | |;
结束循环;
关闭C1;
S:=从T组| |calldate顺序的calldate desc;
打开list_cursor S;
返回list_cursor;
最后fn_rs;




4)。测试是在sql加上执行的:


VaR结果REFCURSOR;
执行:结果:= fn_rs;
打印结果;
calldate callcount1 callcount2 callcount3
---------------------------------------------
2005-08-09 0033
2005-08-08 40779
2005-08-07 6021




描述:解码

解码(价值,因此,IF1,IF2,2,3,3,。其他的)

值表示任何类型的任何表或计算得到任何结果列。当每个值的测试,如果值为1的解码功能,因此结果是;如果值等于2的解码功能,结果是2;等等。事实上,多如果/那么配对可以得到。如果结果不等于任何配对的给定值,译码结果返回到别的。

此外,解码器功能还可以用来比较大小,如下所示:

从双选择解码(符号1变量2),- 1,变量1,变量2);取一个较小的值

符号()函数返回0, 1和- 1,基于值为0,正或负。

例如:

变量1 = 10,变量2 = 20

符号(变量1变量2)返回到1,解码解码结果为变量的1,达到较小值的目的。

更多对Oracle相关内容感兴趣的读者可以看到这个站点的主题:Oracle通用函数的摘要

希望本文能帮助您设计oracle数据库程序。