对不起,如果我的标题不清晰,我有一些语言问题。我有一张
的桌子(很大) Person value Letter
------------------------------------------
Tom value1 A
Tom value2 T
Ann value1 F
Ann value2 R
Ann value3 Y
Jim value3 W
我想将其简化为:
Person value1 value2 value3
------------------------------------------
Tom A T (null)
Ann F R Y
Jim (null) (null) W
类似listagg的东西,但分为不同的列。看起来很简单,但我被卡住了...
编辑:有8个值,而不仅仅是3个,我想使其更简单,同一个人的值不重复(但可以为null /不出现)
答案 0 :(得分:1)
这里是一个选择:想法是使用聚合函数(例如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>