2012-12-16 37 views
0

我正在嘗試編寫一個查詢,該查詢返回僱員人數,平均工資以及低於平均值的僱員人數。在選擇子查詢期間出現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似乎都是聚合函數,我不確定爲什麼我會收到錯誤?

感謝

回答

5

當您使用子查詢階,這是在選擇列表中的子查詢,它應該只返回一行。 通常,子查詢可以返回多行。因此,當您在具有聚合功能的選擇列表中使用它時,應該用包含無副作用的聚合函數來包裝它。

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); 
+0

我不確定你的意思。 COUNT返回一行不是嗎?當我自己運行子查詢時,它返回包含一個數字的一​​行。 – RedRaven

+0

@RedRaven是的,你是對的。我修改了我的答案。 – ntalbs