Oracle Database SQL列转行问题:PIVOT语法报错求助
Oracle PIVOT 查询报错排查与修正
原始数据表
| ID (PrimaryKey) | HumanAttribut | attributValue |
|---|---|---|
| 1 | Name | John |
| 1 | Country | USA |
期望转换结果
| ID (PrimaryKey) | Name | Country |
|---|---|---|
| 1 | John | USA |
错误原因分析
你提供的SQL存在几个问题,导致Oracle抛出missing expression错误:
- Oracle不支持用方括号
[]包裹列名/别名,这是SQL Server的语法,Oracle中直接写列名即可,若列名含特殊字符才需要用双引号""; - SQL中多余的
(*pink*)标记属于无效语法,必须移除; - 存在拼写错误:子查询别名
SourceTabele应为SourceTable,PIVOT中的attributeValue和原表列名attributValue不一致(少了字母e)。
修正后的SQL
SELECT ID, Name, Country FROM ( SELECT ID, HumanAttribut as Ahuman, attributValue FROM tableA WHERE ID = 1 AND HumanAttribut IN ('Name', 'Country') ) as SourceTable PIVOT ( Max(attributValue) FOR Ahuman IN (Name, Country) ) as PIVOT_TABLE;
同类案例说明
Oracle PIVOT的核心是将行数据转列为固定列,需注意:
- 子查询需包含用于分组的列(这里是ID)、用于转列的标识列(Ahuman)、用于聚合的数值/文本列(attributValue);
- FOR子句中直接列出要转成列的取值,无需特殊符号包裹;
- 若转列的取值含特殊字符或大小写敏感,需用双引号包裹,例如
FOR Ahuman IN ("Full Name", "Home Country")。
内容的提问来源于stack exchange,提问作者Bob der Bauer
相关产品推荐
相关产品推荐

