我正在尝试将 4 列转换为行,但采用分层结构。
Col1 Col2 Col3 Col4
YP HEVEA YP HEVEA OTHER CREDITORS L1220001 - OTHER CREDITORS
YP HEVEA YP HEVEA PREPAYMENTS A1323004 - PREPAYMENTS OTHERS
YP HEVEA YP HEVEA PREPAYMENTS A2349032 - PREPAYMENTS NEW
我的要求是将其转换为树层次结构中的单个列,如下所示:
LEVEL COLUMN
1 YP HEVEA
2 YP HEVEA
3A OTHER CREDITORS
4A L1220001 - OTHER CREDITORS
3B PREPAYMENTS
4B A1323004 - PREPAYMENTS OTHERS
4B A2349032 - PREPAYMENTS NEW
我添加了一个“LEVEL”列只是为了显示我想要的顺序,但这在输出中不是必需的。我正在尝试使用
UNPIVOT
但不知道如何实现它。
这是测试数据:
SELECT
'YP HEVEA' Col1, 'YP HEVEA' Col2, 'OTHER CREDITORS' Col3, 'L1220001 - OTHER CREDITORS' Col4
FROM DUAL
UNION
SELECT
'YP HEVEA' Col1, 'YP HEVEA' Col2, 'PREPAYMENTS' Col3, 'A1323004 - PREPAYMENTS OTHERS' Col4
FROM DUAL
UNION
SELECT
'YP HEVEA' Col1, 'YP HEVEA' Col2, 'PREPAYMENTS' Col3, 'A2349032 - PREPAYMENTS NEW' Col4
FROM DUAL
使用
UNPIVOT
将数据转换为分层数据结构,然后使用分层查询并使用 ORDER SIBLINGS BY
生成所需的排序:
WITH hierarchy AS (
SELECT DISTINCT *
FROM (SELECT t.*, NULL AS root FROM table_name t)
UNPIVOT(
(parent, child) FOR depth IN (
(root, col1) AS 1,
(col1, col2) AS 2,
(col2, col3) AS 3,
(col3, col4) AS 4
)
)
)
SELECT child,
LEVEL
FROM hierarchy
START WITH parent IS NULL
CONNECT BY
PRIOR child = parent
AND PRIOR depth + 1 = depth
ORDER SIBLINGS BY child
对于样本数据:
CREATE TABLE table_name (col1, col2, col3, col4) AS
SELECT 'YP HEVEA', 'YP HEVEA', 'OTHER CREDITORS', 'L1220001 - OTHER CREDITORS' FROM DUAL UNION ALL
SELECT 'YP HEVEA', 'YP HEVEA', 'PREPAYMENTS', 'A1323004 - PREPAYMENTS OTHERS' FROM DUAL UNION ALL
SELECT 'YP HEVEA', 'YP HEVEA', 'PREPAYMENTS', 'A2349032 - PREPAYMENTS NEW' FROM DUAL;
输出:
孩子 | 级别 |
---|---|
YP橡胶树 | 1 |
YP橡胶树 | 2 |
其他债权人 | 3 |
L1220001 - 其他债权人 | 4 |
预付款 | 3 |
A1323004 - 预付款其他 | 4 |
A2349032 - 预付款新 | 4 |