2016-09-22 36 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);