Умножьте количество столбцов на количество строк - PullRequest
0 голосов
/ 15 января 2019

У меня есть такая таблица:

  +------+--------+--------+--------+
  | TYPE | PROP_X | PROP_Y | PROP_Z |
  +------+--------+--------+--------+
  |    1 | x1     | y1     | z1     |
  |    2 | x2     | y2     | z2     |
  |    3 | x3     | y3     | z3     |
  |    4 | x4     | y4     | z4     |
  +------+--------+--------+--------+

Как мне получить такой результат:

+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+
| PROP_X_1 | PROP_X_2 | PROP_X_3 | PROP_X_4 | PROP_Y_1 | PROP_Y_2 | PROP_Y_3 | PROP_Y_4 | PROP_Z_1 | PROP_Z_2 | PROP_Z_3 | PROP_Z_4 |
+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+
| x1       | x2       | x3       | x4       | y1       | y2       | y3       | y4       | z1       | z2       | z3       | z4       |
+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+

Полагаю, для этого можно использовать оператор PIVOT, но я не понимаю, как.

P.S. Создать скрипт для таблицы:

create table my_table(type number(1), prop_x varchar2(30 char), prop_y varchar2(30 char), prop_z varchar2(30 char));

insert into my_table select 1 as type, 'x1' as prop_x, 'y1' as prop_y, 'z1' as prop_z from dual union all select 2, 'x2', 'y2', 'z2' from dual union all select 3, 'x3', 'y3', 'z3' from dual union all select 4, 'x4', 'y4', 'z4' from dual; 
commit;

UPD: Прежде всего, мне нужно решение хотя бы для случая, когда type только в (1,2,3,4)

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Решение с pivot - работа только с ограниченным числом строк (и 1_prop_x вместо prop_x_1 плюс порядок столбцов отличается от вопроса, но это нормально для меня):

  select * 
  from 
  (
  select *
  from my_table t
  )
  pivot(
  max(prop_x) as prop_x, max(prop_y) as prop_y, max(prop_z) as prop_z
  for type in (1,2,3,4)
  )
0 голосов
/ 15 января 2019

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

select max(case when type = 1 then prop_x end) as prop_x_1,
       max(case when type = 2 then prop_x end) as prop_x_2,
       max(case when type = 3 then prop_x end) as prop_x_3,
       max(case when type = 4 then prop_x end) as prop_x_4,
       max(case when type = 1 then prop_y end) as prop_y_1,
       . . .
from my_table;
...