查询以查找获得最高薪水的员工人数

时间:2017-06-01 05:39:25

标签: sql tsql

我正在尝试查找表中的员工数量,这些员工的数量恰好可以获得名为tblPerson的表中所有员工的最高薪水。

Select Max(x.[No of Employees]) as Number, x.Salary as Salary  
from
(
Select      Count(Id) as [No of Employees], Salary
from        tblPerson
Group by    Salary 
Having      Salary = MAX(Salary)
)x
where x.[No of Employees]=3

现在我知道这是一种漫长而复杂的方式,但我试图使用派生表来实现。但是我收到了错误:

“列'x.Salary'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中”

我的问题是,为什么我会收到此特定错误,因为主查询是带有where子句的简单Select语句。不是吗??

4 个答案:

答案 0 :(得分:1)

主要是,聚合函数仅适用于其他聚合函数或按列分组。

为什么呢?因为聚合函数需要知道要进行计算的值集。 在这种情况下,max()将希望使用可用于计算的所有数据并显示单个结果(单行),而另一列将希望逐行显示。所以存在冲突。

答案 1 :(得分:0)

public class Transpose {

public static int[][] createPatterned2DArray(int row,int column){
    int width = column;
    int height = row;
    int[][] array = new int[height][width];

    for (int i = 0; i < height; i++)
    {
        for (int j = 0; j < width; j++)
        {
            array[i][j] = i + j + (width * i);
        }
    }

    return array;

}

public static void main(String[] args) {


    System.out.print(createPatterned2DArray(3,5));


}

}

答案 2 :(得分:0)

您收到错误的原因是&#39; max&#39;是一个聚合,而你没有什么可以聚合数字。

Select Max(x.[No of Employees]) as Number, x.Salary as Salary  
from
(
Select      Count(Id) as [No of Employees], Salary
from        tblPerson
Group by    Salary 
Having      Salary = MAX(Salary)
)x
---------
Group by Salary -- all other items in your select statement
---------
where x.[No of Employees]=3

但是,您也可以使用临时表或变量来查找人员。 要通过变量解决此问题,您可以执行以下操作

declare @maxSalary Decimal
set @maxSalary = (Select max(salary) from tblperson) --insert the max value into a variable

然后聚合人(或做其他逻辑):

Select ID from tblperson where salary = @maxSalary

不使用分组的原因是使用变量更有效率,因为您搜索表而不是聚合它。

答案 3 :(得分:0)

谢谢大家。每个答案都对我有帮助但是,我认为我发现了一种非常简单的方法:

Select      top 1 Count(Id) as [No of Employees], salary
from        tblPerson
Group by    Salary
Order by    [No of Employees] DESC