#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, есть способ, но вы должны были спросить об этом именно в своем посте. Однако вы всегда можете отредактировать свой вопрос. В любом случае, вы уже приняли ответ, который не дает никакого динамического решения, так зачем беспокоиться…