Использовать значения select в столбцах - PullRequest
0 голосов
/ 18 июня 2019

Не знаю, достаточно ли понятно название вопроса, но у меня такая ситуация:

TABLE ID, VALUE_1, VALUE_2
       1, HORSE  , 500
       1, DOG    , 400
       1, DUCK   , 300
       2, HORSE  , 500
       2, DOG    , 400
       2, DUCK   , 300

Хочу увидеть такие значения, как

ID HORSE DOG DUCK
1    500 400 300
2    500 400 300

Ответы [ 4 ]

1 голос
/ 18 июня 2019

Использование condititonal aggregation

select id,
       max(case when value_1 = 'HORSE' then value_2 end ) as horse,
       max(case when value_1 = 'DOG' then value_2 end ) as dog,
       max(case when value_1 = 'DUCK' then value_2 end ) as duck
  from tab
 group by id;

Демо

1 голос
/ 18 июня 2019

с условной агрегацией:

select
  ID,
  max(case when value_1 = 'HORSE' THEN value_2 end) HORSE,
  max(case when value_1 = 'DOG' THEN value_2 end) DOG,
  max(case when value_1 = 'DUCK' THEN value_2 end) DUCK
from tablename
group by ID
1 голос
/ 18 июня 2019

Вы можете использовать условное агрегирование:

select id,
       sum(case when value_1 = 'HORSE' then value_2 end) as horse,
       sum(case when value_1 = 'DOG' then value_2 end) as dog,
       sum(case when value_1 = 'DUCK' then value_2 end) as duck
from t
group by id
order by id;
0 голосов
/ 18 июня 2019

В Oracle 11.1 и выше вы можете использовать оператор PIVOT.Предполагая, что имя таблицы T:

select id, horse, dog, duck
from   t
pivot  (min(value_2) 
        for value_1 in ('HORSE' as horse, 'DOG' as dog, 'DUCK' as duck))
order  by id
;

В Oracle 12.1 и выше, того же можно достичь с помощью MATCH_RECOGNIZE (и нам больше не нужна агрегация):

select id, horse, dog, duck
from   t
match_recognize(
  partition by id
  measures  horse.value_2 as horse,
            dog.value_2   as dog,
            duck.value_2  as duck
  pattern   ( (horse|dog|duck)* )
  define    horse as value_1 = 'HORSE', dog as value_1 = 'DOG', 
             duck as value_1 = 'DUCK'
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...