2013-07-31 176 views
2

我有一个表,其中两个字段ID,controlflag.It看起来像重复条目

Id CntrlFlag  
121 SSSSSRNNNSSRSSNNR 
122 SSSNNRRSSNNRSSSSS   
123 RRSSSNNSSSSSSSSSSSSSSS 

我必须得到以下形式输出(R的出现次数)

Id Flag 
121 6,12,17 
122 6,7,12 
123 1,2 

我试过Oracle查询(因为我从这个论坛上获得):

select mtr_id,listagg(str,',') within group (order by lvl) as flags from 
(select mtr_id, instr(mtr_ctrl_flags,'R', 1, level) as str, level as lvl    
    from mer_trans_reject   
    connect by level <= regexp_count(mtr_ctrl_flags, 'R'))group by mtr_id; 

它给出结果,但第二和第三发生(不是第一次)重复一个没有。的时代。 它看起来像

id Flag 
123 6,12,12,12,12,17,17,17,17,17. 

有人可以知道这里有什么问题吗?

+2

它可以通过选择不同的关键字来避免有没有其他方法? –

回答

0

可以通过选择不同的关键字来避免它。是否有其他方法?

是的,有,但是这个人是有点重(不同将花费你少):

with t1(Id1, CntrlFlag) as(
    select 121, 'SSSSSRNNNSSRSSNNR'  from dual union all 
    select 122, 'SSSNNRRSSNNRSSSSS'  from dual union all 
    select 123, 'RRSSSNNSSSSSSSSSSSSSSS' from dual 
) 
select w.id1 
    , listagg(w.r_pos, ',') within group(order by w.id1) as R_Positions 
    from (select q.id1 
      , regexp_instr(q.CntrlFlag,'R', 1, t.rn) as r_pos 
      from t1 q 
     cross join (select rownum rn 
         from(select max (regexp_count(CntrlFlag, 'R')) ml 
           from t1 
          ) 
          connect by level <= ml  
        ) t 
     ) w 
where w.r_pos > 0       
group by w.id1 

结果:

ID1  R_POSITIONS 
---------- ----------- 
     121 12,17,6 
     122 12,6,7 
     123 1,2