最近几天一直在弄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行列转换的思考与总结相关推荐

  1. Oracle 行列转换

    Oracle 行列转换 1.固定列数的行列转换 如 student subject grade --------- ---------- -------- student1 语文 80 student ...

  2. Oracle 行列转换函数pivot使用

    问题描述: 描述:在项目中,需要将表中日期数据行,用视图转列显示月报表 解决方案: 注意:多聚合必须重命名. create table pivottest( 主键 varchar2(50) defau ...

  3. oracle 总转横函数,详解Oracle行列转换函数-pivot函数和unpivot函数-多智时代

    今天主要介绍一下Oracle行转列及列转行常见函数,下面一起来看看吧! 行列转换 pivot函数:行转列函数 语法:pivot(任一聚合函数 for 需专列的值所在列名 in (需转为列名的值)): ...

  4. Oracle 行列转换总结

    行列转换包括以下六种情况: *列转行 *行转列 *多列转换成字符串 *多行转换成字符串 *字符串转换成多列 *字符串转换成多行 下面分别进行举例介绍. 首先声明一点,有些例子需要如下10g及以后才有的 ...

  5. oracle行列转换总结

    最近论坛很多人提的问题都与行列转换有关系,所以我对行列转换的相关知识做了一个总结, 希望对大家有所帮助,同时有何错疏,恳请大家指出, 我也是在写作过程中学习,算是一起和大家学习吧. 行列转换包括以下六 ...

  6. oracle行列转换关联union的方式_几行代码轻松玩转 Excel 行列转换

    几行代码轻松玩转 Excel 行列转换 下面这种交叉式的 Excel 表是很常见的格式,用来填写和查看都比较方便: 但是,如果想做进一步的统计分析,这种格式就不方便了,需要行列转换,变成如下格式的明细 ...

  7. oracle 的行列转换函数,Oracle行列转换函数

    VM_CONCAT vm_concat可以用来进行行转列,默认以逗号分隔,可通过vm_concat(name,',','|')修改为|1 2 3 4 5 6 7 8 9 10 11 12 13SQL& ...

  8. 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 ...

  9. [Oracle]行列转换(行合并与拆分)

    使用wmsys.wm_concat 实现行合并 在 Oracle  中, 将某一个栏位的多行数据转换成使用逗号风格的一行显示,可以使用函数  wmsys.wm_concat 达成. 这个在上一篇 or ...

最新文章

  1. 64位系统上使用*** Client端
  2. struts2前台获取setattribute为空指针异常_告诉你,这样设计 Java 异常更优雅,更牛逼!...
  3. 深入Atlas系列:探究Application Services(2) - 自定义服务器端Profile Service支持
  4. 机器人学习--定位、建图和导航问题从古至今
  5. 暑期OI大电影——不看后悔整个OI生涯!
  6. 反转链表——Java递归求解
  7. 最是人间四月天,细雨点洒樱花前
  8. css元素可拖动,css3实现可拖动的魔方3d效果
  9. Pycharm十大常用快捷键
  10. 从一维cutting问题看列生成算法
  11. Go webrtc项目pion创始人专访 | Gopher Daily (2021.04.07) ʕ◔ϖ◔ʔ
  12. EasyMesh - A Two-Dimensional Quality Mesh Generator
  13. 《Shopee跨境电商运营实战》笔记(第5~8章)
  14. 杨澜:25岁后女孩子必需要懂14件事
  15. 4月有8本SCIE期刊被剔除(附MDPI/Frontiers/Hindawi最新在检期刊)
  16. 学以致用--游戏:孢子(Spore) 中 殖民地 最佳布局
  17. Windows Server2016 安装升级补丁更新
  18. FP6195耐压60V电流降压3.3V5V模块供电方案
  19. DELMIA软件弧焊仿真:机器人焊接起始点与结束点姿态调整方法
  20. barrett hand

热门文章

  1. 前端菜鸟笔记 Day-5 CSS 高级
  2. 拓扑目的 1.Pc9通过van3访问pc10 2.Pc9通过Vlan1\Vlan2访问pc11
  3. 解决JS浮点数(小数)计算加减乘除的BUG
  4. Nginx的Mainline version、Stable version、Legacy version的版本区别
  5. angular之两种路由
  6. Could not delete .........May be locked by another process.
  7. 仅需一个参数就可搞定OneProxy的VIP机制
  8. extjs 文件加载、解析流程
  9. windows server 2008更新补丁失败排错
  10. HttpWatch的Result中出现Aborted的原因分析[配图]