Oracle представила оператор unpivot
в версии 11.1, именно для такого рода проблем. Иллюстрировано ниже. Я создаю пример данных в предложении with
(не является частью запроса, чтобы ответить на ваш вопрос; вы должны удалить его и использовать фактическое имя таблицы). Обратите внимание, что values
является зарезервированным словом, поэтому его не следует использовать в качестве имени столбца; Я использую value
вместо этого. И не должно быть прямой косой черты в именах столбцов; Я заменил подчеркивание.
with
base_data (sno, name, sales, profit) as (
select 1, 'John' , 50, 20 from dual union all
select 2, 'Peter' , 60, 0 from dual union all
select 3, 'Mark' , 15, 10 from dual union all
select 4, 'Nicolas', 0, -10 from dual union all
select 5, 'Alex' , 70, 20 from dual
)
select *
from base_data
unpivot include nulls
(value for sales_profit in (sales as 'Sales', profit as 'Profit'))
;
SNO NAME SALES_PROFIT VALUE
---- ------- ------------ ------
1 John Sales 50
1 John Profit 20
2 Peter Sales 60
2 Peter Profit 0
3 Mark Sales 15
3 Mark Profit 10
4 Nicolas Sales 0
4 Nicolas Profit -10
5 Alex Sales 70
5 Alex Profit 20