请帮我解决 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 |
答案 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
)