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エラーが発生します。

「count」関数が問題の原因である可能性があると思っていましたが、次のような単純なサブクエリを実行することもできます。

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サブクエリを使用する場合、1行のみを返す必要があります。一般に、サブクエリは複数の行を返すことができます。したがって、集計関数を使用して選択リストで使用する場合は、副作用のない集計関数でラップする必要があります。

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:単一グループグループ関数ではありません-クエリエラー」を参照してください。

于 2014-01-17T02:43:08.157 に答える