Вот один из вариантов: идея заключается в использовании агрегатной функции (например, MIN
, MAX
, SUM
). Так как ваши примерные данные содержат только 3 значения, это то же самое, что я и сделал - вы бы использовали еще 5 таких строк (включая их начиная со строки № 13 и далее).
Обратите внимание, что строки № 1 - 8 представляют ваши образец данных; у вас уже есть они хранятся в таблице, поэтому вы не будете печатать это. Код, который вам действительно нужен, начинается со строки № 9.
SQL> with test (person, value, letter) as
2 (select 'Tom', 'val1', 'A' from dual union all
3 select 'Tom', 'val2', 'T' from dual union all
4 select 'Ann', 'val1', 'F' from dual union all
5 select 'Ann', 'val2', 'R' from dual union all
6 select 'Ann', 'val3', 'Y' from dual union all
7 select 'Jim', 'val3', 'W' from dual
8 )
9 select
10 person,
11 max(decode(value, 'val1', letter)) value1,
12 max(decode(value, 'val2', letter)) value2,
13 max(decode(value, 'val3', letter)) value3
14 from test
15 group by person
16 order by person;
PERSON VALUE1 VALUE2 VALUE3
------ ------ ------ ------
Ann F R Y
Jim W
Tom A T
SQL>