1

このcreateステートメントで定義された2つのテーブルがあります

CREATE TABLE PROJECT (project_name varchar(255), project_budget int, dedicated_project_leader int, dedicated_lead_developer int, dedicated_lead_consultant int, company_id int, project_id int, PRIMARY KEY (project_id));
CREATE TABLE WORKER (worker_name varchar(255), worker_salary int, worker_anual_bonus int, worker_type varchar(255), leader int, company_id int, project_id int, worker_id int, PRIMARY KEY (worker_id));

プロジェクトの予算の合計を労働者の数で割るよりもお願いしたいのですが---)

SELECT (SUM(p.project_budget) / (SELECT count(WORKER.WORKER_NAME) from WORKER)) as AVG_BONUS
  FROM PROJECT p;

残念ながら、これにより「ORA--00937:単一グループのグループ関数ではありません」という例外が発生します。

ただし、このクエリを実行すると:

SELECT count(WORKER.WORKER_NAME) from WORKER)

結果は次のようになります。

16

予算の合計を結果ではなく数値で割ると、次のようになります。

SELECT (SUM(p.project_budget) / 16) as AVG_BONUS
      FROM PROJECT p;

私も完璧な結果を得ました。

294117,647058823

解決策は、プロジェクトテーブルで定義されたIDでグループ化する必要があることですが、それが論理的だとは思わない....

SELECT (SUM(p.project_budget) / (SELECT count(WORKER.WORKER_NAME) from WORKER)) as AVG_BONUS
  FROM PROJECT p
   GROUP BY p.company_id;

それも機能しています。

なぜ私がそれを使用できないのか、誰か提案がありますか? (group byなしのselectで2つのグループ関数が存在できないのは、SQL言語仕様だけのような気がします...)

4

5 に答える 5

2

この場合、各集計を独自の非依存ビューにプッシュする必要があります..例:

select budget/workers
  from (select (select sum(p.project_budget) from project p) budget,
               (select count(w.worker_name) from worker w) workers
          from dual);
于 2013-01-21T12:08:01.700 に答える
1

joinまたは、 :を試すことができます

select sum(p.project_budget),
count(w.worker_name),
sum(p.project_budget)/
count(w.worker_name) as avgbonus
from project p
join
worker w
on w.project_id = p.project_id
;

sqlfiddleデモ

| SUM(P.PROJECT_BUDGET) | COUNT(W.WORKER_NAME) | AVGBONUS |
-----------------------------------------------------------
|                150000 |                    4 |    37500 |
于 2013-01-21T12:17:29.933 に答える
1

このクエリはどうですか?

SELECT  sum(project_budget/AVG_BONUS) as AVG_BONUS from(
  SELECT p.project_budget, (SELECT count(WORKER.WORKER_NAME) from WORKER) as AVG_BONUS
  FROM PROJECT p
  )x
于 2013-01-21T12:19:50.477 に答える
0

私はこのようにします:

SELECT (SUM(p.project_budget) / MAX(worker_count)) as AVG_BONUS
FROM 
  PROJECT p
  ,(SELECT count(WORKER.WORKER_NAME) AS worker_count  
    FROM WORKER) wc
GROUP BY p.company_id;

サブクエリは集計でもグループでもないため、あなたのやり方は機能していないと思います。

于 2013-01-21T11:54:00.073 に答える
0

のようなもので試してください
select
project_name,
project_budget / case when w_cnt > 0 then w_cnt else 1 end as w_cnt
from
PROJECT p, ( select project_id, count(*) w_cnt from WORKER w group by project_id ) w
where p.project_id = w.project_id

于 2013-01-21T12:01:05.220 に答える