Question

i have a table in which two fields are id, controlflag.It looks like

Id    CntrlFlag       
121   SSSSSRNNNSSRSSNNR
122   SSSNNRRSSNNRSSSSS           
123   RRSSSNNSSSSSSSSSSSSSSS

I have to get output in the following form( the occurences of R)

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

I tried oracle query( as i obtained from this forum):

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;

it gives the result but 2nd and 3rd occurrences(not 1st one) are duplicated a no. of times. it looks like

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

Can anybody know what's wrong here?

No correct solution

OTHER TIPS

It could be avoided by select distinct keyword.Is there any other way?

Yes, there is, but this one is a little bit heavier(distinct will cost you less):

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

Result:

 ID1        R_POSITIONS
----------  -----------
       121  12,17,6
       122  12,6,7
       123  1,2
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top