将两行更改为两列
Change Two Rows Into Two Columns
这里的 Oracle 新手只是想学习一些东西。
我有一个查询 returns 每个 ID 两行:
SELECT B1_ALT_ID, B1_CHECKLIST_COMMENT
FROM PERMIT
WHERE (B1_CHECKBOX_DESC = 'Certificate Number'
OR B1_CHECKBOX_DESC = 'DIF_Category');
当前输出
如何将 B1_CHECKLIST_COMMENT 列中的两个不同值放入两个单独的列中,而不是两行?
在视觉上,这是我想要实现的目标:
期望的输出
B1_ALT_ID B1_CHECKLIST_1 B1_CHECKLIST_2
DIF13-0001 27654 Fiber
DIF13-0002 1380 Water
DIF13-0003 736 Library
我使用的是 Oracle 12.1 版。
您可以使用 PIVOT
:
SELECT B1_ALT_ID, B1_CHECKLIST_1, B1_CHECKLIST_2
FROM PERMIT
PIVOT (
MAX(B1_CHECKLIST_COMMENT)
FOR B1_CHECKBOX_DESC IN (
'Certificate Number' AS B1_CHECKLIST_1,
'DIF_Category' AS B1_CHECKLIST_2
)
);
或条件聚合:
SELECT B1_ALT_ID,
MAX(
CASE B1_CHECKBOX_DESC
WHEN 'Certificate Number'
THEN B1_CHECKLIST_COMMENT
END
) AS B1_CHECKLIST_1,
MAX(
CASE B1_CHECKBOX_DESC
WHEN 'DIF_Category'
THEN B1_CHECKLIST_COMMENT
END
) AS B1_CHECKLIST_2
FROM PERMIT
GROUP BY B1_ALT_ID;
其中,对于示例数据:
CREATE TABLE permit (b1_alt_id, b1_checklist_comment, b1_checkbox_desc) AS
SELECT 'DIF13-001', '27654', 'Certificate Number' FROM DUAL UNION ALL
SELECT 'DIF13-001', 'Fiber', 'DIF_Category' FROM DUAL UNION ALL
SELECT 'DIF13-002', '1380', 'Certificate Number' FROM DUAL UNION ALL
SELECT 'DIF13-002', 'Water', 'DIF_Category' FROM DUAL UNION ALL
SELECT 'DIF13-003', '736', 'Certificate Number' FROM DUAL UNION ALL
SELECT 'DIF13-003', 'Library', 'DIF_Category' FROM DUAL;
双输出:
B1_ALT_ID
B1_CHECKLIST_1
B1_CHECKLIST_2
DIF13-003
736
Library
DIF13-001
27654
Fiber
DIF13-002
1380
Water
db<>fiddle here
这里的 Oracle 新手只是想学习一些东西。
我有一个查询 returns 每个 ID 两行:
SELECT B1_ALT_ID, B1_CHECKLIST_COMMENT
FROM PERMIT
WHERE (B1_CHECKBOX_DESC = 'Certificate Number'
OR B1_CHECKBOX_DESC = 'DIF_Category');
当前输出
如何将 B1_CHECKLIST_COMMENT 列中的两个不同值放入两个单独的列中,而不是两行?
在视觉上,这是我想要实现的目标:
期望的输出
B1_ALT_ID B1_CHECKLIST_1 B1_CHECKLIST_2
DIF13-0001 27654 Fiber
DIF13-0002 1380 Water
DIF13-0003 736 Library
我使用的是 Oracle 12.1 版。
您可以使用 PIVOT
:
SELECT B1_ALT_ID, B1_CHECKLIST_1, B1_CHECKLIST_2
FROM PERMIT
PIVOT (
MAX(B1_CHECKLIST_COMMENT)
FOR B1_CHECKBOX_DESC IN (
'Certificate Number' AS B1_CHECKLIST_1,
'DIF_Category' AS B1_CHECKLIST_2
)
);
或条件聚合:
SELECT B1_ALT_ID,
MAX(
CASE B1_CHECKBOX_DESC
WHEN 'Certificate Number'
THEN B1_CHECKLIST_COMMENT
END
) AS B1_CHECKLIST_1,
MAX(
CASE B1_CHECKBOX_DESC
WHEN 'DIF_Category'
THEN B1_CHECKLIST_COMMENT
END
) AS B1_CHECKLIST_2
FROM PERMIT
GROUP BY B1_ALT_ID;
其中,对于示例数据:
CREATE TABLE permit (b1_alt_id, b1_checklist_comment, b1_checkbox_desc) AS
SELECT 'DIF13-001', '27654', 'Certificate Number' FROM DUAL UNION ALL
SELECT 'DIF13-001', 'Fiber', 'DIF_Category' FROM DUAL UNION ALL
SELECT 'DIF13-002', '1380', 'Certificate Number' FROM DUAL UNION ALL
SELECT 'DIF13-002', 'Water', 'DIF_Category' FROM DUAL UNION ALL
SELECT 'DIF13-003', '736', 'Certificate Number' FROM DUAL UNION ALL
SELECT 'DIF13-003', 'Library', 'DIF_Category' FROM DUAL;
双输出:
B1_ALT_ID B1_CHECKLIST_1 B1_CHECKLIST_2 DIF13-003 736 Library DIF13-001 27654 Fiber DIF13-002 1380 Water
db<>fiddle here