Oracle - транспонировать строку в столбец - PullRequest
0 голосов
/ 15 октября 2018

Я хотел бы перенести следующий результат строки в столбцы.Я рассматривал PIVOT, но не верю, что смогу достичь желаемого результата.

Как:

ID_NCM | DESTINATION | START      | END  
36393  | PE          | 01-01-2018 | 10-31-2018
36393  | PE          | 11-01-2018 | 12-31-9999

Быть:

ID_NCM | DESTINATION | CURRENT_START | CURRENT_END | FUTURE_START | FUTURE_END
36393  | PE          | 01-01-2018    | 10-31-2018  | 11-01-2018   | 12-31-9999

Я пропустилкакая-то концепция структуры таблицы, при которой желаемое расположение невозможно достичь с помощью оператора select?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Вы можете напрямую использовать grouping by ID_NCM,DESTINATION с функциями min и max:

with t(ID_NCM,DESTINATION,"START","END") as
(  
 select 36393,'PE',date'2018-01-01',date'2018-10-31' from dual union all
 select 36393,'PE',date'2018-01-11',date'9999-12-31' from dual 
)
select ID_NCM,DESTINATION,
       min("START") as CURRENT_START,min("END") as CURRENT_END,
       max("START") as FUTURE_START,max("END") as FUTURE_END
  from t
 group by ID_NCM,DESTINATION

ID_NCM  DESTINATION CURRENT_START  CURRENT_END   FUTURE_START  FUTURE_END
------  ----------- -------------  ------------  ------------  -----------
36393       PE       01.01.2018     31.10.2018    11.01.2018   31.12.9999

PS START и END являются зарезервированными ключевыми словами в Oracle, поэтомузаключили их в двойные кавычки.

Редактировать: Из-за вашего последнего комментария вы можете внести изменения, добавив коррелированный подзапрос, как в следующем стиле:

with t(ID_NCM,DESTINATION,"START","END",tax_rate) as
(  
 select 36393,'PE',date'2018-01-01',date'2018-10-31',0.06 from dual union all
 select 36393,'PE',date'2018-01-11',date'9999-12-31',0.04 from dual 
)
select ID_NCM,DESTINATION,
       min("START") as CURRENT_START,min("END") as CURRENT_END,
       max("START") as FUTURE_START,max("END") as FUTURE_END,
       (select tax_rate from t where "START"=date'2018-01-01' and "END"=date'2018-10-31') 
                                                                         as current_rate,
       (select tax_rate from t where "START"=date'2018-01-11' and "END"=date'9999-12-31') 
                                                                         as future_rate
  from t
 group by ID_NCM,DESTINATION

ID_NCM  DEST   CURRENT_START  CURRENT_END  FUTURE_START  FUTURE_END CURRENT_RATE FUTURE_RATE
------  ----- -------------  ------------  ------------  ----------- ----------- -----------
36393   PE     01.01.2018     31.10.2018    11.01.2018   31.12.9999     0,06          0,04

Отредактированный демонстратор Rextester

0 голосов
/ 15 октября 2018

Вы можете попробовать что-то вроде этого -

select id_ncm,
       destination,
       max(decode(myrank, 1, start_date)) current_start,
       max(decode(myrank, 1, end_date)) current_end,
       max(decode(myrank, 2, start_date)) future_start,
       max(decode(myrank, 2, end_date)) future_end
  from (select id_ncm,
               destination,
               start_date,
               end_date,
               rank() over(partition by id_ncm order by start_date, end_date) myrank
          from your_table) v1
 group by id_ncm, destination
...