0

給与が所属部門の全従業員の平均給与を上回る各従業員の名前を出力します。

  • emp (eid: integer, ename: string, age: integer, salary: real)
  • works (eid: integer, did: integer, pct_time: integer)
  • dept (did: integer, dname: string, budget: real, managerid: integer)

これは私が持っているものです:

SELECT ename FROM emp
WHERE salary > all (
  SELECT AVG(salary) FROM dept, works
  WHERE emp.eid = works.eid AND works.did = dept.did)

問題は、すべての労働者の平均よりも高い給与を持っている人々の名前を取得しているように見えることです. 部門テーブルへのリンクは必要ないと考えていますが、上記の文字列を編集しようとすると、同じ結果が得られます。

4

2 に答える 2

1

平均にサブクエリを使用するアプローチは適切ですが、サブクエリを部門ごとにグループ化する必要があります。次に、次の方法でサブクエリに参加できます。

  • 部門 ID が等しい (等結合)、および
  • 従業員の給与が部門の平均給与より高い (非等結合)

ここにクエリがあります...

SELECT emp.ename, dept.dname, emp.salary, DeptAvg.AvgSal
FROM emp
INNER JOIN works ON emp.eid = works.eid
INNER JOIN dept ON works.did = dept.did
INNER JOIN (
    SELECT works.did, AVG(emp.salary) AS AvgSal
    FROM emp
    INNER JOIN works ON emp.eid = works.eid
    GROUP BY works.did) DeptAvg
  ON DeptAvg.did = works.did AND emp.salary > DeptAvg.AvgSal

このクエリは、従業員名、部署名、従業員の給与、および部門の平均給与を表示します。数値を確認してテストできるようにしました。任意の列を削除しても、クエリは引き続き機能するはずです。

于 2013-03-29T02:39:24.633 に答える