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

EmployeeId Dept1 Dept2 Dept3
150        10    55    6

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

SELECT  EmployeeId, Dept1, Dept2, Dept3 FROM Employee_History

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

EmployeeId Dept
150        10
150        55
150        6
0
Martin James 9 Окт 2021 в 15:45

2 ответа

Лучший ответ

В 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'
                                   )
                )
       );

Demo .

Вам все равно нужно передать список отделов в разделе IN UNPIVOT, поэтому Littlefoot уже предоставляет наилучшее возможное решение.

1
Ankit Bajpai 9 Окт 2021 в 13:38

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
Littlefoot 9 Окт 2021 в 12:53