2016-09-22 105 views
1

有許多會計師,他們每個人都有工作(按小時付費),我需要得到每個會計師的平均工作成本高於總平均值的會計師姓名工作成本。我該怎麼做呢?如何使用子查詢獲得多個平均值

SELECT Accountant_Name, AVG(job_cost) as 'Average' 
FROM job_view 
WHERE Average > (SELECT AVG (job_cost) AS AV 
FROM job_view) 
GROUP BY Accountant_Name; 

所需的一切都在名爲job_view的視圖中。上述代碼不起作用任何幫助修改,將不勝感激。提前致謝。

+0

什麼是你與上面的代碼中發現了錯誤? –

+0

列名'平均'無效 –

+0

'AVG(Job_Cost)'列的'平均'別名在'WHERE'子句中不可見。這就是爲什麼你可以用'AVG(Job_Cost)'替換它的原因,但是你會發現窗口函數只能存在於查詢的'HAVING'和'SELECT'部分。只要看看我如何解決所有這些問題的答案。 –

回答

1

這應該爲你做它:

SELECT Accountant_Name 
    , AVG(Job_Cost) as 'Average' 
FROM Job_View 
GROUP BY Accountant_Name 
HAVING AVG(Job_Cost) > (SELECT AVG(Job_Cost) FROM Job_View) 

根據你的評論,你在WHERE Average >得到的錯誤是因爲別名Average不在WHERE條款可見,通常需要你把正如您在SELECT部分中定義的那樣,該列的全部內容。

但由於在SELECT部分Average列是一個聚集函數,這些只能去在HAVING部低,因爲HAVING處理的聚合條件過濾。

爲什麼這一切?因爲在查詢中有對語句執行順序的規則,如explained here

+0

它使用GROUP BY子句添加了謝謝,但我嘗試了與WHERE相同的事情而不是HAVING,然後它仍然給我一個錯誤。你有什麼可以告訴我這是爲什麼? –

1

你仍然需要由集團Accountant_Name

SELECT Accountant_Name, AVG(job_cost) as 'Average' 
    FROM job_view 
    GROUP BY Accountant_Name 
    Having AVG(job_cost) > (SELECT AVG (job_cost) FROM job_view); 
相關問題