将来自不同行的值插入到一行和多列中,并按x列的特定值分组

时间:2020-02-06 13:57:46

标签: oracle oracle11g

对不起,如果我的标题不清晰,我有一些语言问题。我有一张

的桌子(很大)
   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 /不出现)

1 个答案:

答案 0 :(得分:1)

这里是一个选择:想法是使用聚合函数(例如MINMAXSUM)。由于您的样本数据仅包含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>