打印每个薪水超过所有员工平均薪水的员工的姓名
他或她的部门。


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)


问题是我似乎正在得到薪水高于每个工人的平均水平的人的名字。我在想不需要链接到department表,但是当我尝试编辑上面的字符串时,我仍然得到相同的结果。

最佳答案

您使用子查询作为平均值的方法是合理的,但是您需要按部门对子查询进行分组。然后,您可以通过以下方式加入子查询:


部门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


该查询显示员工姓名,部门名称,员工薪水和平均部门薪水。我这样做是为了让您可以看到数字并进行测试。您可以删除任何列,查询仍然可以使用。

10-04 20:25