2013-03-29 152 views
0

打印每個員工的薪水超過其所在部門所有員工平均薪水的名稱 。MySQL新手:查詢每個員工的薪水超過其部門所有員工平均工資的姓名

  • 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) 

的問題是,我似乎得到誰擁有的人的名字工資超過每個工人的平均水平。我想我不需要鏈接到部門表,但是當我嘗試編輯上面的字符串時,我仍然得到相同的結果。

+0

子查詢需要通過作品的另一個副本另一個加入到'emp':'選擇從EMP AVG(emp2.​​salary)作爲EMP2內部聯接Works2的上emp2.​​eid = works2.eid內連接上Works2的作品。 did = works.did where works.eid = emp.eid'。可能存在另一個問題,這是由於一個員工在少數部門兼職而造成的;在這種情況下,平均值將計算在所有他/她的部門中。 –

回答

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 

該查詢顯示員工姓名,部門名稱,員工薪水和平均部門工資。我做到了,所以你可以看到數字並進行測試。您可以刪除任何列,查詢仍然可以工作。

+0

謝謝,埃德。我們還沒有在課堂上討論內部連接,所以我必須提前閱讀並熟悉自己。不知道是否有另一種方式來解決更多「基本」功能的問題。再一次,謝謝。 –

+0

不客氣@AndrewP。你已經知道內部連接。在原始查詢中有一個:'FROM dept,works WHERE ... works.did = dept.did'列出兩個表以及如何加入它們,特別是'did'值相等的地方。我只是使用了不同的連接語法:而不是'FROM dept,工作在WHERE works.did = dept.did',你可以說'FROM dept INNER JOIN在works.did = dept.did'上工作。一樣。您應該使用您的教授使用的語法,至少在您的課程期間:) –

+0

部門名稱從未被要求過,因此您可以將該列和表全部保留。否則,這正是它應該如何完成的! – Strawberry

0
SELECT emp.ename,dept.dname,emp.salary,avg(emp.salary) as DeptAvgSalary 
FROM emp 
INNER JOIN works ON emp.eid = works.eid 
INNER JOIN dept ON works.did = dept.did 
group by dept.did 
having emp.salary>DeptAvgSalary 
相關問題