2015-04-18 58 views
-1

我已经制作了2个表格 - Department Master和Employee Master。 这是表在MS SQL服务器查询中使用Group By子句

Emp_Id Emp_Name Salary Dept_Id Dept 
1  Chandan 10000.00 1  Mechnical 
2  Sudhir 11000.00 1  Mechnical 
3  Rahul 20000.00 1  Mechnical 
4  Kavish 15000.00 1  Mechnical 
5  sapin 23000.00 2  Computer 
6  Kavita 23200.00 2  Computer 
7  amit  50000.00 2  Computer 

我想用部门名称和员工姓名 薪我用这此组查询,如下所示

select MAX(Emp_Salery) as Emp_Sal from V_New_Emp_Master group by Dept_Id 

我得到最大salery,但当时我想补充EMP_NAME专栏中,我得到一个错误的followes

SQL查询

select MAX(Emp_Salery),Emp_Name as Emp_Sal from V_New_Emp_Master group by Dept_Id 

错误:

Msg 8120, Level 16, State 1, Line 1 
Column 'V_New_Emp_Master.Emp_Name' is invalid in the select list 
because it is not contained in either an aggregate function or the 
GROUP BY clause. 

对此有任何解决方案?

+1

msg说这一切:你永远不会按emp_name分组,所以哪个emp_name应该从sql server中选择7? –

+0

我找到了解决方案。我们需要复杂的子查询。解决方案如下:从V_New_Emp_Master 中选择Emp_Name,Dept_Name,Emp_Salery 其中,Emp_Salery =(从V_New_Emp_Master中选择max(Emp_Salery)作为f,其中f.Dept_Id = V_New_Emp_Master.Dept_Id); – can123

+0

可能的重复[什么是“无效,不包含在任何聚合函数”消息的意思?](http://stackoverflow.com/questions/18258704/what-does-the-invalid-not-contained-in-非彼一个聚集型函数消息-M) – Tanner

回答

0

在ms sql server集合函数查询中,只有当列本身包含在聚合函数中,或者该列用于将group by子句中的行分组时,才能在select中包含列。在你的情况下,你将不得不将查询结构化为具有聚集函数查询的复杂查询作为子查询。

类似,

选择EMP_NAME,Emp_Salery从V_New_Emp_Master其中Emp_Salery =(SELECT MAX(Emp_Salery)从V_New_Emp_Master组由DEPT_ID错误);

我还没有检查过查询,但肯定是这样的,希望这会让你朝着正确的方向前进。

1

您使用子查询你发现自己:

select Emp_Name, Dept_Name, Emp_Salery 
from V_New_Emp_Master 
where Emp_Salery = (select max(Emp_Salery) from V_New_Emp_Master as f where f.Dept_Id = V_New_Emp_Master.Dept_Id); 

或去顶1(这将是可取的,如果V_New_Emp_Master这需要一些时间来执行视图):

select top 1 
     Emp_Name, Dept_Name, Emp_Salery 
from V_New_Emp_Master 
order by Emp_Salery desc 

或者如果您需要可能的最高工资Dept_Id

select Emp_Name, Dept_Name, Emp_Salery, Dept_Id 
from (
    select * 
     , max(Emp_Salery) over (partition by dept_id) max_Salery 
    from V_New_Emp_Master 
) src 
where Emp_Salery=max_Salary