网红小奈奈的经典作品:极其粉嫩的小姐姐角色独白
原来是一奈奈作品一部 大家好...
2023-11-29
对数据库中的数据用SQL实现行列转换,不但需要编写复杂的程序代码,还需要编写存储过程。若引入ORACLE中的分析函数则会使该过程简便很多。首先找出表中所有关键字的属性个数的最大值,设为n,其次为每个关键字新添加n列,并用分析函数查询关键字的属性所处列的位置,然后将每个关键字的多行属性转换成多列属性,最后把生成的多个新列拼成一个串形成一列,从而实现行列转换。
分析函数的设计目的是为了解决诸如“累计计算”等问题。虽然大部分的问题都可以用PL/SQL解决,但是性能并不理想,首先查询本身并不容易编写,其次有些很难在SQL中直接做的查询但实际上是很普通的操作,比如实现数据表中行列传换。这样的问题在SQL中做查询就很困难。在分析函数出现以前,我们必须使用自联查询或者子查询甚至复杂的存储过程实现的语句,现在只要一条简单的SQL语句就可以实现了,而且在执行效率方面也有相当大的提高。本文将以一个实例来描述如何采用分析函数实现数据中的行列互换。
1、分析函数的格式及语法
分析函数是在一个记录行分组的基础上计算它们的总值。行的分组被称窗口,并通过分析语句定义。对于每记录行,定义了一个“滑动”窗口。该窗口确定“当前行”计算的范围。窗口的大小可由各行的实际编号或由时间等逻辑间隔确定。
分析函数以如下形式开头:
Analytic-Function(<Argument>,<Argument>,...)OVER (<Query-Partition-Clause><Order-By-Clause><Windowing-Clause>)
(1)Analytic-Function:分析函数的名称,Oracle10gR2带的内置分析函数有多个,包括:AVG、CORR、COVAR_POP、COVAR_SAMP、COUNT、LAG、LAST、LEAD、MAX、MIN、RANK、SUM等;对于用户自定义的分析函数,分析函数名称需要满足标识符规则。
(2)Arguments:参数,分析函数通常有0到3个参数,参数可以是任何数字类型或是可以隐式转换为数字类型的数据类型。对于用户自定义的参数,可以根据实际情况使用。
(3)OVER:是分析函数就必须使用的关键字,对于既可作为聚集函数又可作为分析函数的函数,Oracle无法识别,必须用over来标识此函数为分析函数。
(4)Query-Partition-Clause:查询分组子句,根据划分表达式设置的规则,PARTITION BY将一个结果逻辑分成N个分组划分表达式。分析函数独立应用于各个分组,并在应用时重置。
(5)Order-By-Clause:(按…排序分组),是排序子句,根据一个或多个排序表达式对分组进行排序。
(6)Windowing-Clause窗口生成语句:窗口生成语句用以定义滑动或固定数据窗口,分析函数在分组内进行分析。该语句能够对分组中任意定义的滑动或固定窗口进行计算。
2、实例原理介绍
本实例是将具有相同关键字的多条记录中的某一不同列合并成一列,例如在一个临时表中包含有用户的编号、电话号码、产品名称、所在营业区以及相关业务名称5个字段,而每个用户的业务可能有多项,这样创建数据表将会造成冗余,现在要想办法将表中编号、电话号码、产品名称、所在营业区四个字段相同的用户的相关业务属性合并成一列解决冗余问题,使用SQL语句会比较困难,甚至需要一定的存储过程。使用Orcale中的分析函数来实现这样的行列转换就比较简单方便了。
3、实例
1)创建临时表
create table temp (num varchar2(15),name varchar2(20),sex varchar2(2),classes varchar2(30),course_name varchar2(50) );
2)构造数据
insert into temp(num,name,sex,classes,course_name) values ('206211','王艺','男','06-1班','保险学');insert into temp(num,name,sex,classes,course_name) values ('206212','肖薇','女','06-2','保险学');insert into temp(num,name,sex,classes,course_name) values ('206212','肖薇','女','06-2','财务管理');insert into temp(num,name,sex,classes,course_name) values ('206212','肖薇','女','06-2','财务会计');insert into temp(num,name,sex,classes,course_name) values ('206213','陈雅诗','女','06-2','电子商务');insert into temp(num,name,sex,classes,course_name) values ('206213','陈雅诗','女','06-2','公共经济学');insert into temp(num,name,sex,classes,course_name) values ('206213','陈雅诗','女','06-2','公司理财');insert into temp(num,name,sex,classes,course_name) values ('206213','陈雅诗','女','06-2','管理学原理');insert into temp(num,name,sex,classes,course_name) values ('206213','陈雅诗','女','06-2','保险学');insert into temp(num,name,sex,classes,course_name) values ('206214','李丹阳','男','06-1','保险学');insert into temp(num,name,sex,classes,course_name) values ('206214','李丹阳','男','06-1','财务管理');insert into temp(num,name,sex,classes,course_name) values ('206214','李丹阳','男','06-1','财务会计');insert into temp(num,name,sex,classes,course_name) values ('206214','李丹阳','男','06-1','电子商务');insert into temp(num,name,sex,classes,course_name) values ('206214','李丹阳','男','06-1','公共经济学');insert into temp(num,name,sex,classes,course_name) values ('206215','杨伊琳','女','06-3班','环境管理学');insert into temp(num,name,sex,classes,course_name) values ('206215','杨伊琳','女','06-3班','管理学原理');insert into temp(num,name,sex,classes,course_name) values ('206215','杨伊琳','女','06-3班','商务谈判');insert into temp(num,name,sex,classes,course_name) values ('206216','李佳琪','男','06-2','土地估计');Commit;
3)先查一下course_name最多的组合
select max(count(course_name))from tempgroup by num,name,sex,classes;

4) 列的位置
用分析函数中的row_number函数,在num,name,sex,classes相同的情况下course_name所处的列的位置(第几列)。
row_number函数解释:返回有序组中一行的偏移量,从而可用于按特定标准排序的行号。
select num, name, sex, classes, course_name, row_number() over(partition by num, name, sex, classes order by course_name) rn from temp;


乱码。将就下..
5)把course_name的所有的行换成列
select num,name,sex,classes, max(decode(rn,1,course_name,null)) course_name_1, max(decode(rn,2,course_name,null)) course_name_2, max(decode(rn,3,course_name,null)) course_name_3, max(decode(rn,4,course_name,null)) course_name_4, max(decode(rn,5,course_name,null)) course_name_5from (select num,name,sex,classes,course_name,row_number() over(partition by num,name,sex,classes order by course_name) rn from temp)group by num,name,sex,classes;


乱码。将就下..
6)把转换后的name拼成一个字符串,放在一行
select num, name, sex, classes, (max(decode(rn, 1, course_name, null)) || max(decode(rn, 2, ',' || course_name, null)) || max(decode(rn, 3, ',' || course_name, null)) || max(decode(rn, 4, ',' || course_name, null)) || max(decode(rn, 5, ',' || course_name, null))) name from (select num, name, sex, classes, course_name, row_number() over(partition by num, name, sex, classes order by course_name) rn from temp) group by num, name, sex, classes;


乱码。将就下..
本文中的程序能够实现以下功能:
①计算具有相同关键字的最多的组合;
②根据分析函数查询某一关键字所处的列的位置;
③把需合并列的所有的行换成列;
④把需要合并的某几列拼成一个串。
分析函数除了拥有以上所介绍的功能,还能够实现诸如求和、Top-N查询、统计某个范围的数据行窗口、交叉表查询等功能。
以上内容就是为大家推荐的oracle行列转换函数(数据库sql语句大全实例)最佳回答,如果还想搜索其他问题,请收藏本网站或点击搜索更多问题
内容来源于网络仅供参考版权声明:所有来源标注为小樱知识网www.xiaoyin02.com的内容版权均为本站所有,若您需要引用、转载,只需要注明来源及原文链接即可。
本文标题:oracle行列转换函数(数据库sql语句大全实例)
本文地址:https://www.xiaoyin02.com/shcs/145904.html
相关文章
手机格式怎么转换,手机上图片如何调整为jpg? 第一步打开手机的文件管理 第二步找到自己需要的图片 第三步点击重名 第四步然后在QQ 聊天输入框中(微...
2023-04-21
手机是怎么缓冲的,小米手机缓存视频怎么转换成mp4? 首先,打开手机,然后在手机桌面打开UC浏览器,接着点击页面中间的图标。 2、接着点击我的视频...
2023-04-21
手机怎么作图片,手机wps表格怎么转换为图片? 新版手机WPS有将表格等内容转换为PDF的功能,手机传递和打开方便。也可以通过截屏或长截屏的方法保存为...
2023-04-21
手机转屏怎么设置,怎么样把手机图片转换成文字? 悠闲的午后,在书上,突然看到一段很精彩很实用的文字,于是用手机拍了下来;当刷手机时,看到一...
2023-04-21
热点文章
2021年独生子女补贴新政策是真的吗(独生子女证有有效期吗)
2021年国庆节阅兵仪式几点开始几点结束(2021年国庆节还有阅兵吗)
鼠目寸光一点红是什么生肖动物(鼠目寸光一点红)指什么生肖,紧密
k0到k9的玩法大全(强制gc的玩法和注意事项)
入土为安是什么生肖《入土为安》打一个生肖动物,词语解释
浙江12月底全面停工是真的吗(浙江什么时候放假停工)
如何做t(t怎么把p做哭)
北京口碑最差的三甲医院(北京301医院最擅长什么)