Агрегаційна конкатенація струн в Oracle 10g

Я використовую Oracle 10 г, у мене є подібний сценарій:

No Name
-- -----
1 Rony
1 James
1 Aby
2 Sam
2 Willy
3 Mike

I need to aggregate and concatenate the strings (with a single space in between), in a way to get the results:

No Name
-- -----
1 Rony James Aby
2 Sam Willy
3 Mike

Я використовую Oracle 10g і повинні реалізувати це за допомогою SQL, а не PL/SQL. Чи є вихід?

3
@Arjun ви знайшли рішення. Я змінив свою відповідь, щоб він відповідав 10г.
додано Автор Dinup Kandel, джерело
@Arjun ви знайшли рішення. Я змінив свою відповідь, щоб він відповідав 10г.
додано Автор Dinup Kandel, джерело
Кілька дублікатів
додано Автор Noel, джерело
Кілька дублікатів
додано Автор Noel, джерело

8 Відповіді

Це легко на 11G, ви можете використовувати функцію LISTAGG, але, на жаль, не на 10G

Існують деякі методики для попередніх версій, однак вони вимагають написання функції.

/string-aggregation-techniques.php

4
додано

Це легко на 11G, ви можете використовувати функцію LISTAGG, але, на жаль, не на 10G

Існують деякі методики для попередніх версій, однак вони вимагають написання функції.

/string-aggregation-techniques.php

4
додано

Спробуйте цей запит

select No  , rtrim(Name,',') Name
   from ( select No , Name , rn from yourtable
           model
  partition by (No)
  dimension by (row_number() over
 (partition by No order by Name) rn
 )
 measures  (cast(Name as varchar2(40)) Name)
   rules
 ( Name[any] order by rn desc = Name[cv()]||' '||Name[cv()+1]
   )
  )
    where rn = 1
    order by NO

Here is your sql demo

3
додано
Чи можна перетворити цю функцію на багаторазову функцію, щоб дозволити використання, наприклад ... виберіть no, gconcat (назва) з mytable;
додано Автор Billy Moon, джерело
@Horrendous_Space_Kablooie так спасибі я думав, що це 11г. тепер його зроблено.
додано Автор Dinup Kandel, джерело
LISTAGG не підтримується в oracle10g
додано Автор Noel, джерело

Спробуйте цей запит

select No  , rtrim(Name,',') Name
   from ( select No , Name , rn from yourtable
           model
  partition by (No)
  dimension by (row_number() over
 (partition by No order by Name) rn
 )
 measures  (cast(Name as varchar2(40)) Name)
   rules
 ( Name[any] order by rn desc = Name[cv()]||' '||Name[cv()+1]
   )
  )
    where rn = 1
    order by NO

Here is your sql demo

3
додано
Чи можна перетворити цю функцію на багаторазову функцію, щоб дозволити використання, наприклад ... виберіть no, gconcat (назва) з mytable;
додано Автор Billy Moon, джерело
@Horrendous_Space_Kablooie так спасибі я думав, що це 11г. тепер його зроблено.
додано Автор Dinup Kandel, джерело
LISTAGG не підтримується в oracle10g
додано Автор Noel, джерело

можна використовувати LISTAGG

see demo here

0
додано
Це стало доступним з 11g.2.
додано Автор user565869, джерело

можна використовувати LISTAGG

see demo here

0
додано
Це стало доступним з 11g.2.
додано Автор user565869, джерело

Спробуйте цей запит SQL

SELECT 
  [No],
  STUFF((
    SELECT ' ' + Name
    FROM #tbl_concat 
    WHERE ([No] = Results.[No]) 
    FOR xml PATH (''))
  ,1,0,'') AS NameValues
FROM #tbl_concat Results
GROUP BY [No] 
0
додано
FOR xml PATH є T-SQL (Microsoft SQL Server)
додано Автор ventiseis, джерело
Ключове слово STUFF велике, дякуйте @ Msyma.
додано Автор Frank Myat Thu, джерело

Спробуйте цей запит SQL

SELECT 
  [No],
  STUFF((
    SELECT ' ' + Name
    FROM #tbl_concat 
    WHERE ([No] = Results.[No]) 
    FOR xml PATH (''))
  ,1,0,'') AS NameValues
FROM #tbl_concat Results
GROUP BY [No] 
0
додано
FOR xml PATH є T-SQL (Microsoft SQL Server)
додано Автор ventiseis, джерело
Ключове слово STUFF велике, дякуйте @ Msyma.
додано Автор Frank Myat Thu, джерело