将列转换为oracle 9i中的行

时间:2017-08-29 10:39:32

标签: sql oracle oracle-sqldeveloper oracle9i

请帮我解决 SQL Oracle 9i ,按ID将列转换为组中的行。
我无法在oracle 9i中使用UNPIVOT进行转换。我不会使用UNION ALL,以后使用的代码太多了。
从这个清单:

表:
员工
ID |数据1 |数据2 |数据3 | DATA 4 |
-------------------------------------------------- --------
1 | 0 | 1 | 3 | 2 |
2 | 1 | 0 | 3 | 0 |

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

1 个答案:

答案 0 :(得分:1)

这是一种手动拆箱的方法:

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行的虚拟“表”(因为你是4个列的univotot)来交叉连接到主表。然后,只需输出第1行的data1,第2行的data2等等。

我在where子句中再次使用了case语句,但你可以在子查询中没有谓词的情况下执行查询,然后在外部查询中添加过滤器(例如select id, source, data from (select e.id, case .... ) where data > 0