2017-06-01 60 views
0

我正在查找表中的員工數量,該表格中的所有員工的最高工資均爲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 

現在我知道這是一種做它的長期和複雜的方式,但我試圖用一個派生表做到這一點。但我得到的錯誤:

我的問題是,「因爲它不是在聚合函數或GROUP BY子句中包含列‘x.Salary’在選擇列表中無效」,我爲什麼由於主查詢是帶有where子句的簡單Select語句,因此我得到這個特定的錯誤。不是嗎?

回答

0
select count(*) from tblPerson where salary=(select max(salary) from tblPerson) 
+0

Nopes ..不工作先生。請看我上面的回覆以上回答 – TotalGadha

+0

檢查你的外部查詢「Select Max(x。[No of Employees])as Number,x.Salary as x從x其中x。[No of Employees] = 3」 。您正試圖計算僱員人數的最大值,並試圖獲得薪水。如果您使用的是Max函數,這是一個聚合函數,那麼select語句中的其他表達式應該是一個group_by表達式。請參閱:https://www.techonthenet.com/sql/max.php –

+0

是的。我現在明白了。我的意思是這個概念。但我仍然無法找出解決方案來做到這一點:( – TotalGadha

1

主要是,聚合函數只能與其他聚合函數一起使用或按列分組。

爲什麼?因爲聚合函數需要知道用來進行計算的一組值。 在你的情況下,max()將希望使用所有可用於計算的數據並顯示單個結果(單行),另一列將希望逐行顯示。所以有衝突。

0

你會得到錯誤,因爲'最大'是一個聚合,而你沒有什麼可以聚合的數量。

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 

其原因不使用一組由是使用變量更加高效,因爲您在搜索表格而不是聚合它。

+0

我還不知道你爲什麼會收到錯誤的解釋。你說max是一個聚合,它是100%正確的。但是,我認爲你所說的不清楚。從 ( SELECT COUNT(號),從tblPerson [員工人數],工資 選擇最大的數目,x.S​​alary薪金 :因爲如果我只是這樣做(X [員工人數。)通過工資 集團擁有工資= MAX(工資) )× ,這個工作使員工的收入頂薪 – TotalGadha

+0

你做這是絕對正確的方式數。你基本上把查詢分爲兩部分,你首先找到最高工資,然後找到賺取該工資的人數。但我想學習如何做到這一點,而不會中斷。所以.. – TotalGadha

+0

爲聚集的SQL邏輯是,你要麼有你聚集(如SELECT MAX(工資)從tblperson) 一個值如果你不這樣做,你需要組所有其他價值,具有不獲取彙總,所以我們按工資分組。 因此,你的錯誤,因爲它不到風度知道如何薪金總額,因爲它不是由它進行分組,並期望某種聚合方法(或分組邏輯)。 你的第二個評論,看到的第一個代碼示例我張貼,它應該工作 - 我只是想突出你需要:) – Martin

0

謝謝大家。每一個答案幫助我。然而,我認爲我發現了一個非常簡單的方法來做到這一點:

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

它不應該是由工資desc''順序分組發言?你擁有它的方式會給你「最受歡迎」的薪水。 –

+0

@Steve尓:否目標沒有發現這是由人的最大數量(最流行的薪水)如你所說賺取的薪水。目標是找出有多少人能夠獲得公司所有人的最高工資。 – TotalGadha

+0

我們中的一個人很困惑。這聽起來像我們同意你想要什麼,但是我仍然認爲[僱員數量] Desc的代碼不可能是正確的。 –

相關問題