将列转换为 oracle 9i 中的行

Convert columns to rows in oracle 9i

请帮助我SQL Oracle 9i,按ID分组将列转换为行。
我无法在 oracle 9i 中使用 UNPIVOT 进行转换。而且我不会用UNION ALL,后面用到的代码太多了
来自这个列表:

Table:
员工
编号 |数据 1 |数据 2 |数据 3 |数据 4 |
---------------------------------------------- --------
1 | 0 | 1 | 3 | 2 |
2 | 1 | 0 | 3 | 0 |

结果
编号 |来源 |数据 |
------------------------------------
1 |数据 2 | 1 |
1 |数据 4 | 2 |
1 |数据 3 | 3 |
2 |数据 1 | 1 |
2 |数据 3 | 3 |

这是一种执行手动逆轴旋转的方法:

WITH employees AS (SELECT 1 ID, 0 data1, 1 data2, 3 data3, 2 data4 FROM dual UNION ALL
                   SELECT 2 ID, 1 data1, 0 data2, 3 data3, 0 data4 FROM dual)
SELECT e.ID,
       CASE WHEN d.id = 1 THEN 'DATA 1'
            WHEN d.id = 2 THEN 'DATA 2'
            WHEN d.id = 3 THEN 'DATA 3'
            WHEN d.id = 4 THEN 'DATA 4'
       END SOURCE,
       CASE WHEN d.id = 1 THEN data1
            WHEN d.id = 2 THEN data2
            WHEN d.id = 3 THEN data3
            WHEN d.id = 4 THEN data4
       END DATA
FROM  employees e
      CROSS JOIN (SELECT LEVEL ID
                  FROM   dual
                  CONNECT BY LEVEL <= 4 -- the number of columns to unpivot
                  ) d
WHERE  CASE WHEN d.id = 1 THEN data1
            WHEN d.id = 2 THEN data2
            WHEN d.id = 3 THEN data3
            WHEN d.id = 4 THEN data4
       END > 0
ORDER BY ID,
         DATA;

        ID SOURCE       DATA
---------- ------ ----------
         1 DATA 2          1
         1 DATA 4          2
         1 DATA 3          3
         2 DATA 1          1
         2 DATA 3          3

这使用了一个 4 行的虚拟 "table"(因为您要取消旋转 4 列)来交叉连接到主 table。那么就只需要输出第1行的data1,第2行的data2,等等

我在 where 子句中再次使用了 case 语句,但是您可以在子查询中不使用谓词进行查询,然后根据需要在外部查询中添加过滤器(例如 select id, source, data from (select e.id, case .... ) where data > 0