如何改进此SQL代码?

如何改进此SQL代码?,sql,union,Sql,Union,这是我的SQL问题。 我的SQL表“Employer”有3列:EmployerName、Salary、WorkPosition(例如Worker、Developer、Manager)。那么,我怎样才能显示所有的雇主的工资高于所有在同一职位工作的雇主的平均工资呢 我这样做是为了得到每个位置的值,并使用UNION显示所有这些值。 它起了作用,但似乎不是一个好的解决方案 (Select Employername From Employer Where WorkingPosition = 'Worke

这是我的SQL问题。 我的SQL表“Employer”有3列:EmployerName、Salary、WorkPosition(例如Worker、Developer、Manager)。那么,我怎样才能显示所有的雇主的工资高于所有在同一职位工作的雇主的平均工资呢

我这样做是为了得到每个位置的值,并使用UNION显示所有这些值。 它起了作用,但似乎不是一个好的解决方案

(Select Employername 
From Employer
Where WorkingPosition = 'Worker' 
and Salary > (Select avg(Salary) from Employer
              Where WorkingPosition = 'Worker')) 
UNION
(Select Employername 
From Employer
Where WorkingPosition = 'Developer' 
and Salary > (Select avg(Salary) from Employer
              Where WorkingPosition = 'Developer')) 
UNION
(Select Employername 
From Employer
Where WorkingPosition = 'Manager' 
and Salary > (Select avg(Salary) from Employer
              Where WorkingPosition = 'Manager')) 
谢谢


您应该能够使用平均值联接派生表

解决这类问题的最好办法是把它分解成几个部分。第一部分是如何得到每个职位的平均工资。您应该能够
分组
,以获得以下信息:

SELECT AVG(Salary) AS AvgSalary, WorkingPosition
FROM Employer
GROUP BY WorkingPosition
然后,您可以加入此表-现在,您已将每个员工与其所在职位的平均工资关联起来:

SELECT *
FROM Employer
INNER JOIN
(
    SELECT AVG(Salary) AS AvgSalary, WorkingPosition
    FROM Employer
    GROUP BY WorkingPosition
) Averages ON Employer.WorkingPosition = Averages.WorkingPosition
最后,添加条件:

SELECT Employer.Employername
FROM Employer
INNER JOIN
(
    SELECT AVG(Salary) AS AvgSalary, WorkingPosition
    FROM Employer
    GROUP BY WorkingPosition
) Averages ON Employer.WorkingPosition = Averages.WorkingPosition
WHERE Employer.Salary > Averages.AvgSalary

如果在
WHERE
子句中处理子查询更为方便,那么也可以这样做。我认为两者的表现应该相当相似:

SELECT Employername
FROM Employer
WHERE Salary > (SELECT AVG(Salary) 
                FROM Employer AS Averages 
                WHERE Employer.WorkingPosition = Averages.WorkingPosition)

您没有说明您的DBMS,以下是ANSI SQL

它将首先计算一次您感兴趣的所有工作职位的平均值。由于结果非常小,数据库服务器很可能会将其保存在内存中。因此,外部(最终)查询中的后续比较不需要每次重新计算平均值(当然,这也取决于所使用的DBMS)

一次将它们全部获取:

Select e1.Employername 
From Employer e1
Where 
e1.Salary > (Select avg(e2.Salary) from Employer e2
              Where e2.WorkingPosition = e1.WorkingPosition)) 

你介意告诉我们你用的是什么数据库系统吗。根据系统的不同,可能会有一些特定于供应商的功能,您可以使用。如果表
Employer
中不仅包含“Worker”、“Developer”和“Manager”?谢谢您的帮助:)谢谢您的帮助:)谢谢您的帮助:)
SELECT Employername
FROM Employer
WHERE Salary > (SELECT AVG(Salary) 
                FROM Employer AS Averages 
                WHERE Employer.WorkingPosition = Averages.WorkingPosition)
with avg_sales as (
  Select WorkingPosition, avg(Salary) as avg_salary
  from Employer
  Where WorkingPosition in ('Worker', 'Developer', 'Manager')
  group by WorkingPosition
)
Select emp.Employername 
From Employer emp
where Salary > (select avg_salary
                from avg_sales s
                where s.WorkingPosition = emp.WorkingPosition)
 and WorkingPosition in ('Worker', 'Developer', 'Manager');
Select e1.Employername 
From Employer e1
Where 
e1.Salary > (Select avg(e2.Salary) from Employer e2
              Where e2.WorkingPosition = e1.WorkingPosition))