表-test
id1 manager
安徽有限公司 仲
安徽有限公司 蔡
安阳责任公司 陈
白山有限公司 仲
包头有限公司 仲
安徽有限公司 谢
北京有限公司 陈
北京有限公司 蔡
福建有限公司 蔡
福建有限公司 仲
福建有限公司 施
id1 manager1 manager2 manager3 … all
安徽有限公司 仲 蔡 … 仲/蔡
安阳责任公司 陈 … 陈
白山有限公司 仲 … 仲
包头有限公司 仲 … 仲
北京有限公司 陈 蔡 … 陈/蔡
福建有限公司 蔡 仲 施 … 蔡/仲/施select a1.id1,a1.manager,a2.manager,a3.manager,a4.manager,a5.manager,
a1.manager||a2.manager||a3.manager||a4.manager||a5.manager
from (
select *
from (
select id1,manager
from (
select aa.id1,aa.manager  ,
(select sum(1) from sys.test1 bb where aa.id1=bb.id1 and aa.manager<=bb.manager ) num
from sys.test1 aa
order by 1,3)
where num=1)) a1,( select *
from (
select id1,manager
from (
select aa.id1,aa.manager  ,
(select sum(1) from sys.test1 bb where aa.id1=bb.id1 and aa.manager<=bb.manager ) num
from sys.test1 aa
order by 1,3)
where num=2) ) a2,
( select *
from (
select id1,manager
from (
select aa.id1,aa.manager  ,
(select sum(1) from sys.test1 bb where aa.id1=bb.id1 and aa.manager<=bb.manager ) num
from sys.test1 aa
order by 1,3)
where num=3) ) a3,
( select *
from (
select id1,manager
from (
select aa.id1,aa.manager  ,
(select sum(1) from sys.test1 bb where aa.id1=bb.id1 and aa.manager<=bb.manager ) num
from sys.test1 aa
order by 1,3)
where num=4) ) a4,
( select *
from (
select id1,manager
from (
select aa.id1,aa.manager  ,
(select sum(1) from sys.test1 bb where aa.id1=bb.id1 and aa.manager<=bb.manager ) num
from sys.test1 aa
order by 1,3)
where num=5) ) a5where a1.id1=a2.id1(+) and a1.id1=a3.id1(+) and a1.id1=a4.id1(+) and a1.id1=a5.id1(+)
order by 1;
select * from test1 order by 1 以上可以实现,有更加简化的方法么?最好有名字的间隔
求助大虾~!
:)

解决方案 »

  1.   

    with a as (
    select '安徽有限公司' AS ID ,'仲' AS manager from dual union
    select '安徽有限公司','蔡' from dual union
    select '安阳责任公司','陈' from dual union
    select '白山有限公司','仲' from dual union
    select '包头有限公司','仲' from dual union
    select '安徽有限公司','谢' from dual union
    select '北京有限公司','陈' from dual union
    select '北京有限公司','蔡' from dual union
    select '福建有限公司','蔡' from dual union
    select '福建有限公司','仲' from dual union
    select '福建有限公司','施' from dual 
    )
    --SELECT ID, manager, MIN(manager) over(PARTITION BY ID) minmanager,(row_number() over(ORDER BY ID, manager)) + (dense_rank() over(ORDER BY ID)) no,row_number() over(PARTITION BY ID ORDER BY manager) rn FROM a
    select ID, substr(max(sys_connect_by_path(manager,'/')),2),max(decode(rn,1,manager,'.')) AS manager1,
    max(decode(rn,2,manager,'.')) AS manager2,max(decode(rn,3,manager,'.')) AS manager3,max(decode(rn,4,manager,'.')) AS manager4,
    max(decode(rn,5,manager,'.')) AS manager5 from 
    (SELECT ID, manager, MIN(manager) over(PARTITION BY ID) minmanager
    ,(row_number() over(ORDER BY ID, manager)) + (dense_rank() over(ORDER BY ID)) no,row_number() over(PARTITION BY ID ORDER BY manager) rn
    FROM a)
    start with manager=minmanager
    connect by no-1 = prior no 
    group by ID