我正在尝试编写一个查询,返回员工人数,平均工资以及低于平均水平的员工人数。
我到目前为止的查询是:
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似乎都是聚合函数,我不确定为什么我会收到错误?
由于
答案 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”以获得更完整的解释。