<b>no version specified, so here it is for the current release:</b>
ops$tkyte%ORA11GR2> select listagg(column_value) within group (
2 order by case when column_value between '0' and '9' then 2
3 else 1
4 end,
5 upper(column_value),
6 case when column_value = lower(column_value) then 1
7 else 2
8 end )
9 from (
10 select data, column_value
11 from (select :x data from dual),
12 TABLE( cast( multiset(
13 select substr( data, level, 1 )
14 from dual
15 connect by level <= length(data) ) as sys.odciVarchar2List ) )
16 )
17 /
LISTAGG(COLUMN_VALUE)WITHINGROUP(ORDERBYCASEWHENCOLUMN_VALUEBETWEEN'0'AND'9'THE
-------------------------------------------------------------------------------
aAbBcCdD12345
<b>this'll work in 10g</b>
ops$tkyte%ORA11GR2> select replace(max(sys_connect_by_path(column_value,',')),',','')
2 from (
3 select column_value, row_number() over (
4 order by case when column_value between '0' and '9' then 2
5 else 1
6 end,
7 upper(column_value),
8 case when column_value = lower(column_value) then 1
9 else 2
10 end ) rn
11 from (
12 select data, column_value
13 from (select :x data from dual),
14 TABLE( cast( multiset(
15 select substr( data, level, 1 )
16 from dual
17 connect by level <= length(data) ) as sys.odciVarchar2List ) )
18 )
19 )
20 start with rn = 1
21 connect by prior rn = rn-1
22 /
REPLACE(MAX(SYS_CONNECT_BY_PATH(COLUMN_VALUE,',')),',','')
-------------------------------------------------------------------------------
aAbBcCdD12345
If you are in 9i, search this site for stragg to replace listagg