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

Oracle如何使用PIVOT实现行转列 同ID多行字段横向并排展示

Oracle 多字段行转列PIVOT实现方案

按id分组将序号对应的code、gift两列同时转为宽表列,直接用Oracle PIVOT的多聚合字段语法即可实现,不需要嵌套多次PIVOT。
注意:样例源表中序号列列名是rownum,这是Oracle内置伪列的保留关键字,实际开发不建议用保留字做列名,如果生产表确实用了这个列名,SQL中需要加双引号引用该列。下面的示例先将该序号列命名为rn做演示,避免语法冲突。

假设源表表名为user_gift_record,表结构为id number, rn number, code varchar2(100), gift number,对应给出的样例数据,执行以下SQL即可得到目标输出:

SELECT *
FROM user_gift_record
PIVOT (
    MAX(code) AS code,
    MAX(gift) AS gift
    FOR rn IN (1, 2, 3)
)

语法说明

  • PIVOT支持同时传入多个聚合字段,格式为聚合函数(待转列名) AS 列名后缀,最终生成的列名会自动拼接为[IN内的序号值]_[后缀],匹配1_CODE/1_GIFT这类命名格式
  • 聚合函数选择MAX是因为当id + rn组合唯一时,MAX返回的就是对应行的准确值,不会出现聚合计算错误,不要对字符串类型的code字段用SUM等数值类聚合函数
  • 如果序号列确实命名为保留字rownum,将SQL中FOR rn替换为FOR "rownum"即可正常运行
  • 静态PIVOT需要在IN子句中枚举所有需要转置的序号值,如果同一个id下的序号数量动态变化,需要配合动态SQL拼接IN子句的枚举值实现

如果需要严格匹配code_1/gift_1的列命名和列顺序,可在IN子句中给序号加别名,外层SELECT指定列顺序即可,调整后SQL如下:

SELECT id, code_1, gift_1, code_2, gift_2, code_3, gift_3
FROM user_gift_record
PIVOT (
    MAX(code) AS code,
    MAX(gift) AS gift
    FOR rn IN (
        1 AS "1",
        2 AS "2",
        3 AS "3"
    )
)

执行后返回结果完全匹配目标格式:

idcode_1gift_1code_2gift_2code_3gift_3
2000Ganymede437Alpha50Ambergris600

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 11:30:43