oracle怎么行合并列 oracle合并多列

oracle数据多行不同列进行合并显示 , 该怎么处理oracle数据多行不同列进行合并显示
select id ,listagg( name, ',' ) within group ( order by id ) as name from TABLE_NAME GROUP BY id;
oracle查询时将两行不同的数值合并成分开的两列原表名字:test
三个字段:姓名:nm,选修课:xx,成绩:cj
分两张情况:
一、选修科目数量确定为2:
两种写法:
1、普通写法
with t as
(select nm,
'选修' || row_number() over(partition by nm order by cj) xx_tp,
'成绩' || row_number() over(partition by nm order by cj) cj_tp,
xx,
cj
from test a)
select nm "姓名",
max(decode(xx_tp, '选修1', xx, null)) "选修1",
max(decode(cj_tp, '成绩1', cj, null)) "成绩1",
max(decode(xx_tp, '选修2', xx, null)) "选修2",
max(decode(cj_tp, '成绩2', cj, null)) "成绩2"
from t
group by nm
2、pivot
【oracle怎么行合并列 oracle合并多列】with t as
(select nm,
'选修' || row_number() over(partition by nm order by cj) xx_tp,
'成绩' || row_number() over(partition by nm order by cj) cj_tp,
xx,
cj
from test a)
select nm "姓名", max(xx1) "选修1", max(cj1) "成绩1", max(xx2) "选修2", max(cj2) "成绩2"
from (select *
from t
pivot(max(xx)
for xx_tp in('选修1' xx1, '选修2' xx2))) a
pivot (max(cj) for cj_tp in('成绩1' cj1, '成绩2' cj2))
group by nm
二、选修科目数量不确定
首先去 ;tid=1609939extra=highlight=动态行转列page=1复制动态行转列的代码到sql窗口中运行,然后执行如下代码:
with t as
(select *
from table(pivot('select nm,
''成绩'' || row_number() over(partition by nm order by cj) cj_tp,
cj
from test a'))),
t1 as
(select *
from table(pivot('select nm,
''选修'' || row_number() over(partition by nm order by cj) cj_tp,
xx
from test a')))
select * from t, t1 where t.nm = t1.nm
以上 。
oracle里面怎么合并两列数据单纯oracle怎么行合并列的select a||b肯定是错的oracle怎么行合并列,oracle怎么行合并列你得有个相同的字段才能进行合并啊
所以你得把两个表做个子查询加上一个行号,然后用两个行号做关联才行
利用Oracle分析函数实现多行数据合并为一行 demo场景 以oracle自带库中oracle怎么行合并列的表emp为例
select ename deptno from emp order by deptno;
ENAMEDEPTNOCLARK KING MILLER SMITH ADAMS FORD SCOTT JONES ALLEN BLAKE MARTIN JAMES TURNER WARD
现在想要将同一部门的人给合并成一行记录 如何做呢oracle怎么行合并列?如下
ENAMEDEPTNOCLARK KING MILLER ADAMS FORD JONES SCOTT SMITH ALLEN BLAKE JAMES MARTIN TURNER WARD
通常我们都是自己写函数或在程序中处理 这里我们利用oracle自带的分析函数row_number()和sys_connect_by_path来进行sql语句层面的多行到单行的合并 并且效率会非常高
基本思路
对deptno进行row_number()按ename排位并打上排位号
select deptno ename row_number() over(partition by deptno order by deptno ename) rank
from emp order by deptno ename;
DEPTNOENAMERANKCLARK KING MILLER ADAMS FORD JONES SCOTT SMITH ALLEN BLAKE JAMES MARTIN TURNER WARD 可看出 经过row_number()后 部门人已经按部门和人名进行了排序 并打上了一个位置字段rank
利用oracle的递归查询connect by进行表内递归 并通过sys_connect_by_path进行父子数据追溯串的构造 这里要针对ename字段进行构造 使之合并在一个字段内(数据很多 只截取部分)
select deptno ename rank level as curr_level
ltrim(sys_connect_by_path(ename ) ) ename_path from (
select deptno ename row_number() over(partition by deptno order by deptno ename) rank
from emp order by deptno ename) connect by deptno = prior deptno and rank = prior rank;
各部门递归后的数据量都是 (n)/ * n 即 deptno= 数据量 ()/ * = ;
deptno= 数据量 ()/ * = ;deptno= 数据量 ()/ * = ;
DEPTNOENAMERANKCURR_LEVELENAME_PATHCLARK CLARK KING CLARK KING MILLER CLARK KING MILLER KING KING MILLER KING MILLER MILLER MILLER
DEPTNOENAMERANKCURR_LEVELENAME_PATHADAMS ADAMS FORD ADAMS FORD JONES ADAMS FORD JONES SCOTT ADAMS FORD JONES SCOTT SMITH ADAMS FORD JONES SCOTT SMITH FORD FORD JONES FORD JONES SCOTT FORD JONES SCOTT SMITH FORD JONES SCOTT SMITH JONES JONES SCOTT JONES SCOTT SMITH JONES SCOTT SMITH SCOTT SCOTT SMITH SCOTT SMITH SMITH SMITH
这里我们仅列出deptno= 的 至此我们应该能否发现一些线索了 即每个部门中 curr_level最高的那行 有我们所需要的数据 那后面该怎么办 取出那个数据? 对了 继续用row_number()进行排位标记 然后再按排位标记取出即可
对deptno继续进行row_number()按curr_level排位
select deptno ename_path row_number() over(partition by deptno order by deptno curr_level desc) ename_path_rank from (select deptno ename rank level as curr_level
ltrim(sys_connect_by_path(ename ) ) ename_path from (
select deptno ename row_number() over(partition by deptno order by deptno ename) rank
from emp order by deptno ename) connect by deptno = prior deptno and rank = prior rank);
DEPTNOENAME_PATHENAME_PATH_RANKCLARK KING MILLER CLARK KING KING MILLER CLARK KING MILLERDEPTNOENAME_PATHENAME_PATH_RANKADAMS FORD JONES SCOTT SMITH ADAMS FORD JONES SCOTT FORD JONES SCOTT SMITH ADAMS FORD JONES FORD JONES SCOTT JONES SCOTT SMITH ADAMS FORD FORD JONES SCOTT SMITH JONES SCOTT ADAMS JONES SMITH SCOTT FORD 这里还是仅列出deptno为 的 至此应该很明了了 在进行一次查询 取ename_path_rank为 的即可获得我们想要的结果
获取想要排位的数据 即得部门下所有人多行到单行的合并
select deptno ename_path from (select deptno ename_path
row_number() over(partition by deptno order by deptno curr_level desc) ename_path_rank
from (select deptno ename rank level as curr_level
ltrim(sys_connect_by_path(ename ) ) ename_path from (
select deptno ename row_number() over(partition by deptno order by deptno ename) rank
from emp order by deptno ename) connect by deptno = prior deptno and rank = prior rank))
lishixinzhi/Article/program/Oracle/201311/17343
oracle 两行数据合并为一行数据合并可以做到,不过如果不是单一的一条记录,那不就变成笛卡尔积了?
比如有两行不同姓名的行 , 再有两行不同姓名1的行 。
那么你得到的结果就是4行(也就是笛卡尔积) , 而且内容全不完全都不同,这个结果应该不是你要的吧 。
比如前面的两行内容为aaa;bbb(一个字母表示一个字段,这是两行内容)
后面两行的内容为ccc;ddd(一个字母表示一个字段 , 这是两行内容)
那么你得到的结果就是aaaccc;aaaddd;bbbccc;bbbddd
这个四行的结果是你要的么?
Oracle中多行合并为一列,具体内容请看问题补充,谢谢select name,
max(case when course = '语文' then course else null end) course1,
max(case when course = '语文' then score else null end) score1,
max(case when course = '数学' then course else null end) course2,
max(case when course = '数学' then score else null end) score2,
max(case when course = '英语' then course else null end) course3,
max(case when course = '英语' then score else null end) score3
from table
group by name
oracle怎么行合并列的介绍就聊到这里吧 , 感谢你花时间阅读本站内容,更多关于oracle合并多列、oracle怎么行合并列的信息别忘了在本站进行查找喔 。

    推荐阅读