在数据透视期间指定列时标识符无效 - ORA-00904

Posted

技术标签:

【中文标题】在数据透视期间指定列时标识符无效 - ORA-00904【英文标题】:Invalid Identifier When Specifying Columns During Pivot - ORA-00904 【发布时间】:2020-01-22 17:12:22 【问题描述】:

在尝试创建数据透视表时,我在以下查询中收到 ORA-00904 invalid identifier 错误。

表定义

create table table1(id int, name varchar2(20), col1 int);
insert into table1 values(1, 'Alex', 99);
insert into table1 values(2, 'Alex', 98);
insert into table1 values(3, 'James', 97);
insert into table1 values(4, 'Eric', 99);
insert into table1 values(5, 'Stan', 99);

错误查询

select name, col1
from table1
pivot (count(name) for col1 in (99, 98, 97))
;

但是,以下查询将起作用

工作查询 1

select *
from table1
pivot (count(name) for col1 in (99, 98, 97)) p
;

工作查询 2

with cte as (
  select name, col1
  from table1
)
select *
from cte
pivot (count(name) for col1 in (99, 98, 97))
;

我更喜欢 Working Query 2 的输出,因为我得到的计数不包括所有其他数据

    99 | 98 | 97
-------|----|-------
    3  |  1 | 1

为什么在直接从表中指定列时尝试进行透视时会出现错误?

SQL Fiddle Example - Error is on 3rd query

【问题讨论】:

【参考方案1】:

pivot 之后,name 不再在结果集中。它已被名称如“99”的计数和列替换。

这就是为什么人们经常使用select *pivot。大多数列已经在in 子句中列出。

【讨论】:

以上是关于在数据透视期间指定列时标识符无效 - ORA-00904的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Oracle 11 中取消透视单行?

尝试在 Oracle SQL 中取消透视列时出错

在 Pivot 块中获取无效标识符 ORA-00904

SQL 错误:ORA-00904:创建表期间标识符无效

引导层初始化期间发生错误。 plexus.container.default:无效的模块名称:'default' 不是 Java 标识符

MySQL数据表的修改:修改字段名