Есть несколько способов, которые вы можете получить результат. Обе версии, которые я показываю, используют row_number()
, чтобы помочь преобразовать строки в столбцы.
Вы можете использовать агрегатную функцию с выражением CASE-:
select
name,
max(case when seq = 1 then org end) org1,
max(case when seq = 2 then org end) org2,
max(case when seq = 3 then org end) org3,
max(case when seq = 4 then org end) org4,
max(case when seq = 5 then org end) org5
from
(
select name, org,
row_number() over(partition by name
order by org) seq
from yourtable
) d
group by name;
См SQL Fiddle with Demo. Или, так как вы используете Oracle 11g, вы можете использовать функцию PIVOT, чтобы преобразовать строки в столбцы:
select name,
Org1,
Org2,
Org3,
Org4,
Org5
from
(
select name, org,
row_number() over(partition by name
order by org) seq
from yourtable
) d
pivot
(
max(org)
for seq in ('1' as Org1, '2' as Org2,
'3' as Org3, '4' as Org4,
'5' as Org5)
) piv
См SQL Fiddle with Demo. Оба дают результат:
| NAME | ORG1 | ORG2 | ORG3 | ORG4 | ORG5 |
| aaaa | bbb | bbbb | bbbbb | (null) | (null) |
| bbbb | cccc | (null) | (null) | (null) | (null) |
Какую версию Oracle вы используете? У вас будет ограниченное количество оргов для каждого имени? – Taryn
Oracle 11 да. Я думаю, что 5 - это большинство орг, каждое имя может иметь – haoyun