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" ) )
执行后返回结果完全匹配目标格式:
| id | code_1 | gift_1 | code_2 | gift_2 | code_3 | gift_3 |
|---|---|---|---|---|---|---|
| 2000 | Ganymede | 437 | Alpha | 50 | Ambergris | 600 |
内容的提问来源于stack exchange,提问作者Michael Robinson
相关产品推荐
相关产品推荐

