Oracle文本数据透视需求:基于ColumnB实现指定格式数据转换
Oracle数据透视实现需求
现有Oracle数据表结构及数据如下:
| ColumnA | ColumnB | Codes | ColumnD | ColumnE |
|---|---|---|---|---|
| 1 | A | Type1 | Text1 | Yes |
| 1 | A | Type1 | Text2 | Yes |
| 1 | B | Type2 | Text3 | Yes |
| 2 | C | Type1 | Text4 | No |
| 2 | D | Type2 | Text5 | No |
| 2 | E | Type3 | Text6 | No |
需要基于Codes进行数据透视,将数据转换为以下格式:
| ColumnA | Type1 - ColumnB | Type2 - ColumnB | Type3 - ColumnB | Type1 - ColumnD | Type2 - ColumnD | Type3 - ColumnD | ColumnE |
|---|---|---|---|---|---|---|---|
| 1 | A | B | NA | Text1 & Text2 | Text3 | NA | Yes |
| 2 | C | D | E | Text4 | Text5 | Text6 | No |
注意:ColumnE与ColumnA关联,每个ColumnA对应唯一的ColumnE值。
实现SQL代码
WITH pre_agg AS ( SELECT ColumnA, Codes, MAX(ColumnB) AS ColumnB_val, LISTAGG(ColumnD, ' & ') WITHIN GROUP (ORDER BY ColumnD) AS ColumnD_concat, ColumnE FROM your_table_name GROUP BY ColumnA, Codes, ColumnE ) SELECT ColumnA, NVL(Type1_ColumnB, 'NA') AS "Type1 - ColumnB", NVL(Type2_ColumnB, 'NA') AS "Type2 - ColumnB", NVL(Type3_ColumnB, 'NA') AS "Type3 - ColumnB", NVL(Type1_ColumnD, 'NA') AS "Type1 - ColumnD", NVL(Type2_ColumnD, 'NA') AS "Type2 - ColumnD", NVL(Type3_ColumnD, 'NA') AS "Type3 - ColumnD", ColumnE FROM pre_agg PIVOT ( MAX(ColumnB_val) AS ColumnB, MAX(ColumnD_concat) AS ColumnD FOR Codes IN ('Type1' AS Type1, 'Type2' AS Type2, 'Type3' AS Type3) ) ORDER BY ColumnA;
代码说明
- 预聚合CTE:先按
ColumnA和Codes分组,用MAX(ColumnB)提取对应列值(同一分组下ColumnB唯一),用LISTAGG拼接ColumnD的内容;因ColumnE与ColumnA唯一关联,分组时直接包含即可。 - PIVOT转换:通过
PIVOT将Codes的不同取值转为列,分别映射ColumnB和ColumnD的聚合结果。 - 空值替换:用
NVL将透视后产生的空值替换为NA,匹配目标格式要求。 - 排序:最终按
ColumnA排序,保证结果顺序与示例一致。
内容的提问来源于stack exchange,提问作者misguided
相关产品推荐
相关产品推荐

