You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle文本数据透视需求:基于ColumnB实现指定格式数据转换

Oracle数据透视实现需求

现有Oracle数据表结构及数据如下:

ColumnAColumnBCodesColumnDColumnE
1AType1Text1Yes
1AType1Text2Yes
1BType2Text3Yes
2CType1Text4No
2DType2Text5No
2EType3Text6No

需要基于Codes进行数据透视,将数据转换为以下格式:

ColumnAType1 - ColumnBType2 - ColumnBType3 - ColumnBType1 - ColumnDType2 - ColumnDType3 - ColumnDColumnE
1ABNAText1 & Text2Text3NAYes
2CDEText4Text5Text6No

注意: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;

代码说明

  1. 预聚合CTE:先按ColumnA和Codes分组,用MAX(ColumnB)提取对应列值(同一分组下ColumnB唯一),用LISTAGG拼接ColumnD的内容;因ColumnE与ColumnA唯一关联,分组时直接包含即可。
  2. PIVOT转换:通过PIVOT将Codes的不同取值转为列,分别映射ColumnB和ColumnD的聚合结果。
  3. 空值替换:用NVL将透视后产生的空值替换为NA,匹配目标格式要求。
  4. 排序:最终按ColumnA排序,保证结果顺序与示例一致。

内容的提问来源于stack exchange,提问作者misguided

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 09:47:44