选择子查询期间ORA-00937错误

时间:2012-12-16 04:42:32

标签: oracle ora-00937

我正在尝试编写一个查询,返回员工人数,平均工资以及低于平均水平的员工人数。

我到目前为止的查询是:

select trunc(avg(salary)) "Average Pay", 
count(salary) "Total Employees",
(
   select count(salary)
   from employees 
   where salary < (select avg(salary) from employees)
) UnderPaid
from employees;

但是当我运行它时,我在子查询中得到ora-00937错误。

我原以为“计数”功能可能是导致问题的原因,但即使运行更简单的子查询,例如:

select trunc(avg(salary)) "Average Pay", 
count(salary) "Total Employees",
(
  select avg(salary) from employees 
) UnderPaid
from employees;

仍会返回相同的错误。由于AVG和COUNT似乎都是聚合函数,我不确定为什么我会收到错误?

由于

2 个答案:

答案 0 :(得分:5)

当您使用scala子查询(它是选择列表中的子查询)时,它应该只返回一行。 通常,子查询可以返回多行。因此,当您在具有聚合函数的选择列表中使用它时,您应该使用没有副作用的聚合函数来包装它。

select count(*), (select count(*) from emp) from emp
-- ERROR. Oracle doesn't know that the subquery returns only 1 row.

select count(*), max((select count(*) from emp)) from emp
-- You know that the subquery returns 1 row, applying max() results the same.

或者您可以像这样重写查询:

select avg(salary), count(*), count(case when salary < sal_avg then 1 end)
from (select salary, avg(salary) over () sal_avg from emp);

答案 1 :(得分:0)

ntalbs'答案有效(谢谢,ntalbs!),但如果您需要,请参阅问题“ORA-00937: Not a single-group group function - Query error”以获得更完整的解释。