按别名分组 (Oracle)

Posted

技术标签:

【中文标题】按别名分组 (Oracle)【英文标题】:Group by alias (Oracle) 【发布时间】:2008-11-06 12:04:11 【问题描述】:

如何使用别名对查询进行“分组”,例如:

select count(*), (select * from....) as alias_column 
from table 
group by alias_column

我收到 'alias_column' : INVALID_IDENTIFIER 错误消息。为什么?如何对这个查询进行分组?

【问题讨论】:

【参考方案1】:
select
  count(count_col),
  alias_column
from
  (
  select 
    count_col, 
    (select value from....) as alias_column 
  from 
    table
  ) as inline
group by 
  alias_column

如果您在 GROUP BY 子句中重复相应的表达式,分组通常会起作用。只提及别名是不可能的,因为 SELECT 步骤是执行查询的最后一步,分组发生在更早的时候,当时还没有定义别名。

要对子查询的结果进行 GROUP BY,您必须绕道而行并使用嵌套查询,如上所述。

【讨论】:

【参考方案2】:

用别名列嵌套查询:

select count(*), alias_column
from
( select empno, (select deptno from emp where emp.empno = e.empno) as alias_column
  from emp e
)
group by alias_column;

【讨论】:

【参考方案3】:
select count(*), (select * from....) as alias_column 
from table 
group by (select * from....)

在 Oracle 中,您不能在 group by 子句中使用别名。

【讨论】:

【参考方案4】:

要在 Oracle 中使用别名,您需要确保该别名已由您的查询在使用别名时定义。

最直接的方法是简单地将原始查询视为子查询——在这种情况下,

select count(*), (select * from....) as alias_column 
from table 
group by (select * from....)

变成

select count, alias_column 
from
  (select count(*) as count, (select * from....) as alias_column 
  from table)
group by alias_column 

我无法谈论对性能的影响,但如果您尝试在查询中重用别名,写起来会非常快 - 将所有内容放在括号中并提升一个级别...

【讨论】:

【参考方案5】:

如果您不必使用别名,您可以这样做:

select  
EXTRACT(year from CURRENT_DATE), count(*) from something
group by EXTRACT(year from CURRENT_DATE)
order by EXTRACT(year from CURRENT_DATE)

而不是使用别名和子查询。

【讨论】:

以上是关于按别名分组 (Oracle)的主要内容,如果未能解决你的问题,请参考以下文章

oracle中怎么按每小时分组。数据如下:

oracle怎么按个数分组

oracle按小时分组查询

Oracle - 按日期区分组

Oracle - 按类别分组,日期范围[重复]

Oracle - 按多维数据集分组 - 按不同列求和