Oracle 转向文本问题

问题描述 投票:0回答:1
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 个值

oracle pivot
1个回答
0
投票

使用

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 没有

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.