您的位置:首页 > 数据库 > Oracle

oracle行转为列的方法:

2016-05-19 12:09 471 查看
今天遇到了行转为列的问题,在网上搜到一个经典的例子

又一个示例:

create table dd_app.bb AS(

select '01' no,'ss' name, 10 jiner,'麦子' you from dual union all

select '02' no,'dd' name, 11 jiner,'萝卜' you from dual union all

select '03' no,'cc' name, 9 jiner,'大豆' you from dual union all

select '01' no,'ss' name, 10 jiner,'白菜' you from dual)

;

WITH tab AS(

select '01' no,'ss' name, 10 jiner,'麦子' you from dual union all

select '02' no,'dd' name, 11 jiner,'萝卜' you from dual union all

select '03' no,'cc' name, 9 jiner,'大豆' you from dual union all

select '01' no,'ss' name, 10 jiner,'白菜' you from dual)

SELECT a.no, a.name, a.jiner, ltrim(MAX(sys_connect_by_path(you, ',')), ',') you

FROM (SELECT row_number() over(PARTITION BY a.no, a.name, a.jiner

ORDER BY a.no, a.name, a.jiner) rn,a.*

FROM tab a) a

START WITH rn = 1

CONNECT BY PRIOR rn = rn - 1 AND

a.no = PRIOR a.no AND

a.name = PRIOR a.name AND

a.jiner = PRIOR a.jiner

GROUP BY a.no, a.name, a.jiner

经过在oracle中测试,把分解说明分享一下:

--1,下面的这个sql求得的rn 是按no,name,jiner排序,第n次出现的次数统计

select row_number() over(partition by no,name,jiner order by no,name,jiner) rn,dd_app.bb.* from dd_app.bb;

--结果

RN NO NAME JINER YOU

1 01 ss 10 麦子

2 01 ss 10 白菜

1 02 dd 11 萝卜

1 03 cc 9 大豆

;

--2,行连接为列

select no,name,jiner,sys_connect_by_path(name||'.'||you,',')

from (

select row_number() over(partition by no,name,jiner order by no,name,jiner) rn,dd_app.bb.* from dd_app.bb

)t

connect by prior rn=rn-1 and t.no=prior t.no

;

--结果

NO NAME JINER SYS_CONNECT_BY_PATH(NAME||'.'|

01 ss 10 ,ss.麦子

01 ss 10 ,ss.麦子,ss.白菜

03 cc 9 ,cc.大豆

01 ss 10 ,cc.大豆,ss.白菜

02 dd 11 ,dd.萝卜

01 ss 10 ,dd.萝卜,ss.白菜

01 ss 10 ,ss.白菜

;

--3,去重,其实这里只是选取了长度最大的记录

select no,name,jiner,max(sys_connect_by_path(name||'.'||you,','))

from (

select row_number() over(partition by no,name,jiner order by no,name,jiner) rn,dd_app.bb.* from dd_app.bb

)

connect by prior rn=rn-1

group by no,name,jiner

另一种简的方法:运用wm_concat直接把行变为一列,并用","分隔

select wm_concat(name) from test group by type;

填写不合要求,退回重新编写计划,需求分析

另附列转为行的方法:

decode(clumn_name,条件1,结果1,条件2,结果2,条件3,结果3,...)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: