Oracle行列转换的思考与总结
最近几天一直在弄Oracle-SQL的问题,涉及到了一些平时没有用到的东西,也因此而在这里郁闷了好久。现在问题得到了解决虽说不算完美。但是还是和大家一起分享一下。
行列转换之一:sum(case when.. then.. else.. end) as 语句
这种也可能是我们遇到的第一个行列转换的方法。巧妙的利用汇总和判断语句就可以解决的。
先看一个简单的基础表:如下图
create table STUDENT
(
STUNAME NVARCHAR2(50),
SUBJECTNAME NVARCHAR2(50),
SUBJECTSCORE NUMBER
)
表中有两个人的成绩,每一行代表每个学生该学科的成绩。这个也是我们初学SQL时候很常见的一个表结构了。
要求:把上面的多行值以学生为单位转化为2行值,可以很直观的看出每个学生的各科成绩。于是乎便有了下面的语句。
select
s.stuname,
sum(case when s.subjectname='语文' then s.subjectscore else 0 end ) as 语文成绩,
sum(case when s.subjectname='数学' then s.subjectscore else 0 end ) as 数学成绩,
sum(case when s.subjectname='英语' then s.subjectscore else 0 end ) as 英语成绩
from student s
group by s.stuname
order by s.stuname
执行后所得结果:
上面的做法也很容易让人理解,在这里就不多说了,但是上面的也是有局限性的。因为此处毕竟存在着一些固定值。比如case 中的“语文,数学。。”不过遇到小的业务需求,还是可以拿来直接用的。比如一个学生成绩管理系统这个就可以满足了。
行列转换之二:sys_connect_by_path系统函数,自定义函数,connect by sname = prior sname and rank-1 = prior rank递归 语句
素材还是上面的表,下面我想得到的结果是:
把一个对象的各个学科的属性连接起来放入到一个列中,用字符串存放。
当时看到这个业务需求的时候,当然学生这个只是举个例子。很没有头绪。但是业务那边也急着要数据,没办法。只好硬着头皮想办法。首先就想起了这个要用连接字符串的函数,还需要判断循环之类的。于是乎就想起了这样做,创建一个自定义函数。来处理字符串不断的相加。
方法1:自定义函数,循环
CREATE OR REPLACE FUNCTION getallsubject(parameter varchar2)--有参数方法,字符串
RETURN varchar2
IS
return_str varchar2(4000);--该方法返回一个字符串。
BEGIN
FOR rs IN
(
SELECT s.subjectname||':'||s.subjectscore as allshow
FROM student s
WHERE s.stuname=parameter--当参数一直符合条件 for循环插入结果集rs
) LOOP
return_str:=return_str||rs.allshow;--loop所有字符串,相加
END LOOP;
RETURN return_str;
END;
执行select s.stuname,getallsubject(s.stuname) from student s
可见,改方法对每一行值都进行了判断,产生了多条记录。然后select distinct s.stuname,getallsubject(s.stuname) from student s
效果:
得到了想要的结果。
方法2:利用oracle自带的sys_connect_by_path
要说明的是:
所以在使用这个函数之前,我们必须先对源数据进行处理。第一步简单的处理一下。
create table stu1 as
select s.stuname sname,s.subjectname||s.subjectscore sshow from student s
--
select *from stu1
如下所示:
OK下面就可以写语句了。
select sname as 姓名,allstr 详细描述 from
(
select sname,allstr,
row_number() over(partition by sname order by sname,curr_level desc) ename_path_rank
from (
select sname,sshow,rank,level as curr_level,
ltrim(sys_connect_by_path(sshow,','),',') allstr from --把所有字符串相加
(
select s1.sname,s1.sshow,row_number() over(partition by s1.sname order by s1.sname,s1.sshow) rank
from stu1 s1 order by s1.sname,s1.sshow--创建树关系,name可以作为parentid,rank可以作为childid
) connect by sname = prior sname and rank-1 = prior rank
)
)
where ename_path_rank=1;
执行结果:
也得到了我们想要的结果。当然不用学科之间的间隔符我们可以用replace函数自定义。
比较复杂一点的行列转换用以上两个方法都可以实现。但是这两个方法却都存在着一些优点和缺点。但是本人建议还是使用下面的方法比较靠谱。
虽然结合上面的各种方法解决了这个问题,但是Oracle中字符类型值不能大于4000字节这个问题还一直没解决。我在想有没有一种数据类型,我可以往里面想放多少字节就可以放多少字节的呢。。欢迎各位高手指导!希望可以帮得上遇到该问题的或者是即将遇到该问题的朋友们。
转载于:https://www.cnblogs.com/shengs/p/4089273.html
Oracle行列转换的思考与总结相关推荐
- Oracle 行列转换
Oracle 行列转换 1.固定列数的行列转换 如 student subject grade --------- ---------- -------- student1 语文 80 student ...
- Oracle 行列转换函数pivot使用
问题描述: 描述:在项目中,需要将表中日期数据行,用视图转列显示月报表 解决方案: 注意:多聚合必须重命名. create table pivottest( 主键 varchar2(50) defau ...
- oracle 总转横函数,详解Oracle行列转换函数-pivot函数和unpivot函数-多智时代
今天主要介绍一下Oracle行转列及列转行常见函数,下面一起来看看吧! 行列转换 pivot函数:行转列函数 语法:pivot(任一聚合函数 for 需专列的值所在列名 in (需转为列名的值)): ...
- Oracle 行列转换总结
行列转换包括以下六种情况: *列转行 *行转列 *多列转换成字符串 *多行转换成字符串 *字符串转换成多列 *字符串转换成多行 下面分别进行举例介绍. 首先声明一点,有些例子需要如下10g及以后才有的 ...
- oracle行列转换总结
最近论坛很多人提的问题都与行列转换有关系,所以我对行列转换的相关知识做了一个总结, 希望对大家有所帮助,同时有何错疏,恳请大家指出, 我也是在写作过程中学习,算是一起和大家学习吧. 行列转换包括以下六 ...
- oracle行列转换关联union的方式_几行代码轻松玩转 Excel 行列转换
几行代码轻松玩转 Excel 行列转换 下面这种交叉式的 Excel 表是很常见的格式,用来填写和查看都比较方便: 但是,如果想做进一步的统计分析,这种格式就不方便了,需要行列转换,变成如下格式的明细 ...
- oracle 的行列转换函数,Oracle行列转换函数
VM_CONCAT vm_concat可以用来进行行转列,默认以逗号分隔,可通过vm_concat(name,',','|')修改为|1 2 3 4 5 6 7 8 9 10 11 12 13SQL& ...
- oracle行列转换
多行转一行: 表结构: 1 A 1 B 1 C 2 A 2 B 3 C 3 F 4 D 转换后变成: 1 A,B,C 2 A,B 3 C,F 4 D 这个不排序: SELECT ...
- [Oracle]行列转换(行合并与拆分)
使用wmsys.wm_concat 实现行合并 在 Oracle 中, 将某一个栏位的多行数据转换成使用逗号风格的一行显示,可以使用函数 wmsys.wm_concat 达成. 这个在上一篇 or ...
最新文章
- 64位系统上使用*** Client端
- struts2前台获取setattribute为空指针异常_告诉你,这样设计 Java 异常更优雅,更牛逼!...
- 深入Atlas系列:探究Application Services(2) - 自定义服务器端Profile Service支持
- 机器人学习--定位、建图和导航问题从古至今
- 暑期OI大电影——不看后悔整个OI生涯!
- 反转链表——Java递归求解
- 最是人间四月天,细雨点洒樱花前
- css元素可拖动,css3实现可拖动的魔方3d效果
- Pycharm十大常用快捷键
- 从一维cutting问题看列生成算法
- Go webrtc项目pion创始人专访 | Gopher Daily (2021.04.07) ʕ◔ϖ◔ʔ
- EasyMesh - A Two-Dimensional Quality Mesh Generator
- 《Shopee跨境电商运营实战》笔记(第5~8章)
- 杨澜:25岁后女孩子必需要懂14件事
- 4月有8本SCIE期刊被剔除(附MDPI/Frontiers/Hindawi最新在检期刊)
- 学以致用--游戏:孢子(Spore) 中 殖民地 最佳布局
- Windows Server2016 安装升级补丁更新
- FP6195耐压60V电流降压3.3V5V模块供电方案
- DELMIA软件弧焊仿真:机器人焊接起始点与结束点姿态调整方法
- barrett hand
热门文章
- 前端菜鸟笔记 Day-5 CSS 高级
- 拓扑目的 1.Pc9通过van3访问pc10 2.Pc9通过Vlan1\Vlan2访问pc11
- 解决JS浮点数(小数)计算加减乘除的BUG
- Nginx的Mainline version、Stable version、Legacy version的版本区别
- angular之两种路由
- Could not delete .........May be locked by another process.
- 仅需一个参数就可搞定OneProxy的VIP机制
- extjs 文件加载、解析流程
- windows server 2008更新补丁失败排错
- HttpWatch的Result中出现Aborted的原因分析[配图]