我正在尝试查找表中的员工数量,这些员工的数量恰好可以获得名为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语句。不是吗??
答案 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