将列转换为 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
)
请帮助我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
)