Если вы используете Oracle 11g + используйте:
with tab(EMPID,EMPNAME,COMPANY1,COMPANY2,COMPANY3,COMPANY4) as (
select 111, 'AAA', 'TCS', null, null, null from dual union all
select 222, 'BBB', 'CTS', 'WIPRO', null, null from dual union all
select 333, 'CCC', 'CGI', 'INFY', 'TECHM', 'GOOGLE' from dual
)
----------------------
--- End of data
----------------------
select empid, empname, companies
from tab
unpivot (companies for company in (COMPANY1, COMPANY2, COMPANY3, COMPANY4));
Для более старых версий, использование:
with tab(EMPID,EMPNAME,COMPANY1,COMPANY2,COMPANY3,COMPANY4) as (
select 111, 'AAA', 'TCS', null, null, null from dual union all
select 222, 'BBB', 'CTS', 'WIPRO', null, null from dual union all
select 333, 'CCC', 'CGI', 'INFY', 'TECHM', 'GOOGLE' from dual
),
----------------------
--- End of data
----------------------
table1 as (SELECT EMPID,
EMPNAME,
DECODE(rown, 1, COMPANY1,
2, COMPANY2,
3, COMPANY3,
4, COMPANY4,
'N/A') AS companies
FROM tab,
(SELECT level AS rown
FROM dual
CONNECT BY level <= 4))
select *
from table1
where companies is not null
order by 1;
Выход в обоих случаях будет:
| EMPID | EMPNAME | COMPANIES |
|-------|---------|-----------|
| 111 | AAA | TCS |
| 222 | BBB | CTS |
| 222 | BBB | WIPRO |
| 333 | CCC | GOOGLE |
| 333 | CCC | INFY |
| 333 | CCC | TECHM |
| 333 | CCC | CGI |