Вставка значений из разных строк в одну строку и группирование нескольких столбцов по указанному c значению столбца x - PullRequest
0 голосов
/ 06 февраля 2020

Извините, если у меня нет ясности в названии, у меня есть некоторые языковые проблемы. У меня есть таблица (довольно большая), например

   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, но в разные столбцы. Выглядит просто, но я застрял ...

edit: есть 8 значений, а не только 3, я хотел сделать это проще, значения не повторяются для одного и того же человека (но могут быть нулевыми / не отображаться ))

1 Ответ

1 голос
/ 06 февраля 2020

Вот один из вариантов: идея заключается в использовании агрегатной функции (например, 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...