日期:2014-05-17  浏览次数:20838 次

求一条sql,请大家帮忙,谢谢
A表:
员工 科室 登记日期
张三 胸外科,皮肤科 2000-11-19
李四 胸外科 2001-01-04
王五 妇产科,骨科 2001-01-08
求一条sql,让其结果如下显示
A表:
员工 科室 登记日期
张三 胸外科 2000-11-19
张三 皮肤科 2000-11-19
李四 胸外科 2001-01-04
王五 妇产科 2001-01-08
王五 骨科 2001-01-08

即A表员工属于多个科室的是在一行上用逗号分隔的,现在要把这种形式换成用增加行的形式来解决,属于多个科室就有多行记录


------解决方案--------------------
SQL code

with t1 as
(
select '张三' c1,'胸外科,皮肤科' c2,date'2000-11-19' c3  from dual 
union all
select '李四','胸外科',date'2001-01-04'  from dual 
union all
select '王五','妇产科,骨科',date'2001-01-08' from dual
)

select c1,
  substr(','||c2||',',instr(','||c2,',',1,b.rn)+1,
  instr(c2||',',',',1,b.rn)-instr(','||c2,',',1,b.rn)) c2,c3
from t1,
  (select rownum rn from t1
  connect by rownum<10) b
  where length(c2)-length(replace(c2,','))+1>=b.rn
order by c1,b.rn    

     c1     c2    c3
-----------------------------------------------
1    李四    胸外科    2001/1/4
2    王五    妇产科    2001/1/8
3    王五    骨科    2001/1/8
4    张三    胸外科    2000/11/19
5    张三    皮肤科    2000/11/19

------解决方案--------------------
借上面的数据用一下

SQL code

with t1 as
(
select '张三' c1,'胸外科,皮肤科,骨科1,骨科2,骨科3,骨科4,骨科5,骨科6,骨科7,骨科8,骨科9,骨科10,骨科11,骨科12,骨科13,骨科14,骨科15,骨科16,骨科17' c2,date'2000-11-19' c3  from dual 
union all
select '李四','胸外科',date'2001-01-04'  from dual 
union all
select '王五','妇产科,骨科',date'2001-01-08' from dual
)


select DISTINCT c1
       ,c3
       ,REPLACE( -- 去除多余的【,】
            regexp_substr(c2||',' ,'.*?'||'[,]' ,1 ,LEVEL)  -- 截取 ,【科室】,
            ,',') "科室"
from t1
        connect by level <= nvl(
                               length(regexp_replace(c2,'[^,]','')) + 1
                              ,1)
order by c1;