Преобразование двух значений столбца в один столбец в Oracle SQL - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть таблица, как это ниже,

SNO     Name    Sales   Profit
1      John       50    20
2      Peter      60    0 
3      Mark       15    10
4      Nicolas      0  -10
5      Alex       70    20

Я хотел бы преобразовать это в ниже (т.е. значения продаж и прибыли должны быть объединены в один столбец).

SNO     Name     Sales_Profit Values
1      John        Sales      50
1      John        profit     20
2      Peter       Sales      60
2      Peter       Profit      0

и т. Д.

Есть ли способ справиться с этим сценарием без функций / процедур?

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

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
0 голосов
/ 08 ноября 2018

Один метод использует cross join:

select t.sno, s.name, sp.salesprofit,
       (case when sp.salesprofit = 'Sales' then sales else profit end) as values
from t cross join
     (select 'Profit' as salesprofit from dual union all
      select 'Sales' from dual
     ) sp;

Преимущество этого подхода перед union all состоит в том, что он должен сканировать таблицу только один раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...