Перенос столбцов в строки одной и той же таблицы

#sql #oracle

Вопрос:

У меня есть следующая таблица :

 EmployeeId Dept1 Dept2 Dept3
150        10    55    6
 

это запрос для получения такого результата :

 SELECT  EmployeeId, Dept1, Dept2, Dept3 FROM Employee_History
 

Это мой ожидаемый результат :

 EmployeeId Dept
150        10
150        55
150        6
 

Ответ №1:

В Oracle есть предложение как UNPIVOT, которое позволяет динамически перемещать строки —

 WITH DATA AS (SELECT 150 EmployeeId, 10 Dept1, 55 Dept2, 6 Dept3 FROM DUAL)
SELECT EmployeeId, DEPT
  FROM (SELECT * FROM DATA
        UNPIVOT (DEPT FOR NAMES IN (Dept1 AS 'Dept1',
                                    Dept2 AS 'Dept2',
                                    Dept3 AS 'Dept3'
                                   )
                )
       );
 

ДЕМОНСТРАЦИЯ.

Вам все еще нужно передать список отделов в пункте «НЕАКТИВНО», поэтому лучшее возможное решение уже предоставлено Littlefoot.

Ответ №2:

UNION 3 dept колонки:

 SQL> select employee_id, dept1 as dept from employee_history
  2  union all
  3  select employee_id, dept2 as dept from employee_history
  4  union all
  5  select employee_id, dept3 as dept from employee_history;

EMPLOYEE_ID       DEPT
----------- ----------
        150         10
        150         55
        150          6

SQL>
 

Комментарии:

1. есть ли какой-либо способ сделать это динамически ?

2. В том, что вы опубликовали, нет ничего динамичного , так почему же решение должно быть динамичным ? В каком смысле динамичный?

3. @MartinJames, есть способ, но вы должны были спросить об этом именно в своем посте. Однако вы всегда можете отредактировать свой вопрос. В любом случае, вы уже приняли ответ, который не дает никакого динамического решения, так зачем беспокоиться…