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数据库程序。