2012-02-28 7 views
1

я ниже таблицезначения столбцов в строке

id count hour age range 
    ------------------------------------- 
    0  5  10  61  10-200 
    1  6  20  61  10-200 
    2  7  15  61  10-200 
    5  9  5  61  201-300 
    7  10  25  61  201-300 
    0  5  10  62  10-20 
    1  6  20  62  10-20 
    2  7  15  62  10-20 
    5  9  5  62  21-30 
    1  8  6  62  21-30 
    7  10  25  62  21-30 
    10  15  30  62  31-40 

мне нужно, чтобы выбрать различные значения диапазона столбца Я попытался следующий запрос

Select distinct range as interval from table name where age = 62; 

его результат в колонке следующим образом:

interval 
---------- 
10-20 
21-30 
31-41 

Как я могу получить результат следующим образом?

10-20, 21-30, 31-40 

EDITED: Я сейчас пытаюсь следующий запрос:

select sys_connect_by_path(range,',') interval 
from 
    (select distinct NVL(range,'0') range , ROW_NUMBER() OVER (ORDER BY RANGE) rn 

from table_name where age = 62) 

where connect_by_isleaf = 1 CONNECT BY rn = PRIOR rn+1 start with rn = 1; 

Что дает мне выход, как:

ребята плз помочь мне получить мой желаемый результат.

ответ

2

Если вы находитесь на 11.2, а не только 11.1, вы можете использовать LISTAGG агрегатной функции

SELECT listagg(interval, ',') 
     WITHIN GROUP(ORDER BY interval) 
    FROM (SELECT DISTINCT range AS interval 
      FROM table_name 
     WHERE age = 62) 

Если вы используете более раннюю версию Oracle, вы можете использовать один из других Oracle string aggregation techniques на странице Тима Холла , До 11.2, мое личное предпочтение было бы создать user-defined aggregate function, так что вы можете

SELECT string_agg(interval) 
    FROM (SELECT DISTINCT range AS interval 
       FROM table_name 
      WHERE age = 62) 

Если вы не хотите, чтобы создать функцию, однако, вы можете использовать ROW_NUMBER and SYS_CONNECT_BY_PATH approach, хотя это, как правило, чтобы получить немного труднее следовать

with x as (
    SELECT DISTINCT range AS interval 
      FROM table_name 
     WHERE age = 62) 
select ltrim(max(sys_connect_by_path(interval, ',')) 
       keep (dense_rank last order by curr), 
       ',') range 
    from (select interval, 
       row_number() over (order by interval) as curr, 
       row_number() over (order by interval) -1 as prev 
      from x) 
connect by prev = PRIOR curr 
    start with curr = 1 
+0

no im using 11.1 его не поддерживает функции listagg и concatenate. – Pramod

+0

@Pramod - Обновлен мой ответ с функциональностью до 11.2 –

+0

Спасибо, Justin, это действительно сработало .. Большое вам спасибо – Pramod