Search code examples
sqloracle-databaseunpivot

UNPIVOT on multiple columns to return multiple columns


Below is the requirement to be acheived in PL/SQL-

The table format is

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

Sample Data -

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

Table data looks like -

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 

Now, I want to get the output as below -

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

How can I acheive this? Appreciate your input


Solution

  • like this:

    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
    

    or 10g and below:

    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