A 栏 | B 栏 | 代码 | D 栏 | E 栏 |
---|---|---|---|---|
1 | A | 类型1 | 文字1 | 是的 |
1 | A | 类型1 | 文字2 | 是的 |
1 | B | 类型2 | 文字3 | 是的 |
2 | C | 类型1 | 文字4 | 没有 |
2 | D | 类型2 | 文字5 | 没有 |
2 | E | 类型3 | 文本6 | 没有 |
我希望能够在 B 列上旋转,使视图如下所示:
A 栏 | 类型 1 - B 列 | 类型 2 - B 列 | 类型 3 - B 列 | 类型2 - ColumnD | 类型2 - ColumnD | 类型 3 - ColumnD | E 栏 |
---|---|---|---|---|---|---|---|
1 | A | B | 不适用 | 文本1和文本2 | 文字3 | 不适用 | 是的 |
2 | C | D | E | 文字4 | 文字5 | 文本6 | 没有 |
请注意 E 列与 A 列关联,因此每个记录 A 列只能有 1 个值
使用
DENSE_RANK
函数根据每个 columnb
的 columna
值对行进行编号,然后 PIVOT
:
SELECT columna,
"1_TYPE_B" AS type_1_b,
"2_TYPE_B" AS type_2_b,
"3_TYPE_B" AS type_3_b,
"1_TYPE_D" AS type_1_d,
"2_TYPE_D" AS type_2_d,
"3_TYPE_D" AS type_3_d,
columne
FROM (
SELECT ColumnA, ColumnB, ColumnD, ColumnE,
DENSE_RANK() OVER (PARTITION BY columnA ORDER BY columnB) AS rnk
FROM table_name t
)
PIVOT (
MAX(columnB) AS type_b,
LISTAGG(columnD, ' & ') WITHIN GROUP (ORDER BY columnD) AS type_d
FOR rnk IN (
1 AS "1", 2 AS "2", 3 AS "3"
)
);
对于样本数据:
CREATE TABLE table_name (ColumnA, ColumnB, Codes, ColumnD, ColumnE) AS
SELECT 1, 'A', 'Type1', 'Text1', 'Yes' FROM DUAL UNION ALL
SELECT 1, 'A', 'Type1', 'Text2', 'Yes' FROM DUAL UNION ALL
SELECT 1, 'B', 'Type2', 'Text3', 'Yes' FROM DUAL UNION ALL
SELECT 2, 'C', 'Type1', 'Text4', 'No' FROM DUAL UNION ALL
SELECT 2, 'D', 'Type2', 'Text5', 'No' FROM DUAL UNION ALL
SELECT 2, 'E', 'Type3', 'Text6', 'No' FROM DUAL;
输出:
专栏 | TYPE_1_B | TYPE_2_B | TYPE_3_B | TYPE_1_D | TYPE_2_D | TYPE_3_D | 专栏 |
---|---|---|---|---|---|---|---|
1 | A | B | 空 | 文本1和文本2 | 文字3 | 空 | 是的 |
2 | C | D | E | 文字4 | 文字5 | 文本6 | 没有 |