2013-01-16 131 views
0

下面是在PL要来达到的要求/ SQL-UNPIVOT多个列返回多个列

表格式是

CREATE TABLE NETWORK_TABLE (ORIG_CODE NUMBER, ORIG_SV NUMBER, DEST_CODE NUMBER, DEST_SV NUMBER) 

示例数据 -

INSERT INTO network_table VALUES (14, 1, 15, 1); 

INSERT INTO network_table VALUES (18, 4, 11, 1); 

INSERT INTO network_table VALUES (15, 1, 22, 3); 

INSERT INTO network_table VALUES (23, 2, 21, 1); 

INSERT INTO network_table VALUES (14, 3, 11, 1); 

INSERT INTO network_table VALUES (12, 2, 22, 2); 

表数据看起来像 -

Orig_r orig_sv dest_r dest_sv 
    14  1  15  1 
    12  2  22  2 
    18  4  11  1 
    15  1  22  3 
    14  3  11  1 

现在,我希望得到如下的输出 -

ROOT SV 
14 1 
15 1 
12 2 
22 2 
18 4 
11 1 
15 1 
22 3 
14 3 
1 1 

我怎样才能达致这?感谢您的输入

回答

2

这样的:

SQL> select * from network_table; 

ORIG_CODE ORIG_SV DEST_CODE DEST_SV 
---------- ---------- ---------- ---------- 
     14   1   15   1 
     12   2   22   2 
     18   4   11   1 
     15   1   22   3 
     14   3   11   1 

SQL> select case name when 'ORIG_SV' then orig_code else dest_code end code, val 
    2 from network_table 
    3 unpivot (val for name in (orig_sv, dest_sv)); 

     CODE  VAL 
---------- ---------- 
     14   1 
     15   1 
     12   2 
     22   2 
     18   4 
     11   1 
     15   1 
     22   3 
     14   3 
     11   1 

或10g及以下:

SQL> select case r when 1 then orig_code else dest_code end code, 
    2   case r when 1 then orig_sv else dest_sv end val 
    3 from network_table, (select rownum r from dual connect by level <= 2) 
    4/

     CODE  VAL 
---------- ---------- 
     14   1 
     12   2 
     18   4 
     15   1 
     14   3 
     15   1 
     22   2 
     11   1 
     22   3 
     11   1 
+0

完美!谢谢 – Silpa

0

您可以使用UNION ALL从列将数据转换行:

select ORIG_CODE Root, ORIG_SV SV 
from network_table 
union all 
select DEST_CODE, DEST_SV 
from network_table 
order by root 

SQL Fiddle with Demo

UNION ALL会留下任何重复的值。如果你想删除重复的,那么你可以使用UNION

+0

谢谢!这可以通过使用UNPIVOT来实现吗?只是想知道.. – Silpa