2013-07-31 222 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