0

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

到目前为止我的查询是:

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 似乎都是聚合函数,我不确定为什么会出现错误?

谢谢

4

2 回答 2

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);
于 2012-12-16T04:51:29.733 回答
0

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

于 2014-01-17T02:43:08.157 回答