2015-04-18 94 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