2013-12-09 64 views
0

我有這樣LISTAGG查詢結果不同的值

+----------------------------+----------------------------+ 
| Customer_ref(varchar2(40)) | Event_source-varchar2(40)) | 
+----------------------------+----------------------------+ 
| ctx10000012    | 12474748,1247574,1247674 | 
| ctx10000013    | 12474748,12474749,12474750 | 
+----------------------------+----------------------------+
SELECT LISTAGG(EVENT_SOURCE, ', ') WITHIN GROUP(ORDER BY EVENT_SOURCE) from 
      (select distinct customer_ref, EVENT_SOURCE from CUSTEVENTSOURCE where customer_ref = Acc.Customer_ref AND END_DTM IS NULL) 

表的表的輸出應該像

+----------------------------+----------------------------+ 
| Customer_ref(varchar2(40)) | Event_source-varchar2(40)) | 
+----------------------------+----------------------------+ 
| ctx10000012    | 12474748,1247574,1247674 | 
| ctx10000013    | 12474748 - 12474750  | 
+----------------------------+----------------------------+

我如何能做到這一點,在單選擇查詢(因爲我在光標內部使用了這個select查詢。

您的幫助表示讚賞。

+0

'單選擇查詢。因爲我我在光標內使用了這個select查詢。「這是什麼意思,你可以把示例代碼不工作? – Pratik

+0

@ Pratik-With在單選查詢中,我只是想給出輸出事件是否順序或不順序。如果順序需要給'-'作爲分隔符。 – user3045098

+0

請大家...請幫我解決這個問題..我需要你的幫助.. – user3045098

回答

0

沒有內置的功能來幫助你。因此,編寫一個名爲ranges_string的PL/SQL函數(或任何你喜歡的名稱),將字符串從'1,2,3,5,7,8,9'轉換爲'1-3,5,7-9'(然而,還是你需要它),然後把它在你的SELECT語句:

select ranges_string(listagg(event_source, ', ') within group(order by event_source)) 
from 
(
    select distinct customer_ref, event_source from custeventsource 
    where customer_ref = acc.customer_ref and end_dtm is null 
); 

編輯:這裏是轉換爲範圍(轉換「1,2,3,6,7,8,10,12功能,13,14'至'1-3,6-8,10,12-14')。 (如與表中選擇使用()用了)我沒有花太多的時間在上面,因此它肯定是不是很大,可以隨意去改變它:-)

create or replace function convert_ranges(vi_numbers varchar2) return varchar2 is 
    type table_of_integer is table of integer index by binary_integer; 
    v_numbers table_of_integer; 
    v_ranges varchar2(4000); 
    v_pos integer; 
    v_count integer; 
begin 
    -- Tokenize 
    select regexp_substr(vi_numbers, '[^,]+', 1, level) as num 
    bulk collect into v_numbers 
    from dual 
    connect by regexp_substr(vi_numbers, '[^,]+', 1, level) is not null; 

    -- Collect 
    v_ranges := v_numbers(1); 
    v_pos := 2; 
    while v_pos <= v_numbers.count loop 
    v_count := 0; 
    while v_pos <= v_numbers.count and v_numbers(v_pos) = v_numbers(v_pos-1) + 1 loop 
     v_count := v_count + 1; 
     v_pos := v_pos + 1; 
    end loop; 
    if v_count > 0 then 
     v_ranges := v_ranges || '-' || v_numbers(v_pos-1); 
    end if; 
    if v_pos <= v_numbers.count then 
     v_ranges := v_ranges || ','; 
     v_ranges := v_ranges || v_numbers(v_pos); 
     v_pos := v_pos + 1; 
    end if; 
    end loop; 

    return v_ranges; 
end convert_ranges; 
+0

:你能幫我寫range_string函數,因爲我是新來的sql。 – user3045098

+0

請大家可以幫我在這... – user3045098

+0

沒有人幫忙.. – user3045098