Это можно сделать в чистом виде SQL. В Oracle вы можете использовать функции регулярного выражения и регулярное выражение для разделения строк с разделителями, а затем использовать агрегирование строк для создания списка имен по темпераменту:
with cte (name, temperament, temp, cnt, lvl) as (
select
name,
temperament,
regexp_substr (temperament, '[^, ]+', 1, 1) temp,
regexp_count(temperament, ',') cnt,
1 lvl
from mytable
union all
select
name,
temperament,
regexp_substr (temperament, '[^, ]+', 1, lvl + 1),
cnt,
lvl + 1
from cte
where lvl <= cnt
)
select
temp temperament,
listagg(name, ', ') within group(order by name) name,
count(*) cnt
from cte
group by temp
order by 1
Демо на DB Fiddle :
TEMPERAMENT | NAME | CNT
:---------- | :-------------------- | --:
Caring | Golden | 1
Cute | Golden, Husky, Poodle | 3
Loving | Golden | 1
Loyal | Golden, Husky | 2
Smart | Husky, Poodle | 2