考慮一個EMPLOYEE包含列的表empid,deptid并salary提取工資高于平均值的所有員工。他們部門的
我嘗試了兩種方法 - 第一種方法是:
Select empid, deptid, salary
From employee
Group by empid, deptid, salary
Having salary > (Select avg(salary) From employee)
這回傳了正確的輸出。
但
Select empid, deptid, salary, avg(salary) average
From employee
Group by empid, deptid, salary
Having salary > avg(salary)
沒有輸出也沒有錯誤,它是黑色輸出。
使用的軟體是 Microsoft SQL Server
我想知道為什么第二個輸出沒有回傳任何輸出?
uj5u.com熱心網友回復:
您在第二個查詢中沒有得到結果的原因是因為您按薪水分組,因此該組中的所有薪水都將相同,因此平均值將相同。所以如果某個組內的工資是50k,平均就是50k,50k不大于50k,是相等的。
我還假設這empId是您的主鍵,因此按此分組(沒有其他連接)幾乎總是毫無意義的,因為根據定義,每組只有一行。
您的第一個查詢也不正確,您需要按部門過濾子查詢以確保您只比較該特定員工部門內的平均值,例如
Select empid,deptid,salary
From employee AS e
Group by empid,deptid,salary
Having salary>(Select avg(salary) FROM employee AS e2 WHERE e2.deptId = e.Deptid)
但是,由于您已將聚合移動到子查詢,因此GROUP BY和HAVING不是必需的,這可以簡化為:
Select empid,deptid,salary
From employee AS e
Where salary>(Select avg(salary) FROM employee AS e2 WHERE e2.deptId = e.Deptid);
然而,我傾向于使用視窗函式來做到這一點:
SELECT e.EmpID, e.DeptId, e.Salary, e.DeptAvg
FROM ( SELECT e.EmpID,
e.deptid,
e.Salary,
DeptAvg = AVG(e.Salary) OVER(PARTITION BY e.deptid)
FROM employee AS e
) AS e
WHERE e.Salary > e.DeptAvg;
uj5u.com熱心網友回復:
首先,您為每一行 SQL 計算特定記錄的 AVG,因此每個 AVG(salary) 將等于特定員工的工資。在這里你尋找兩個操作,第一個找到單個部門的平均工資,第二個是特定部門找到高于該部門平均工資的員工串列
;WITH cteavgsalary AS
(SELECT deptid,
AVG(salary) AS avgsalary
FROM employee
GROUP BY deptid)
SELECT e.empid, e.deptid, e.salary, cte.avgsalary
FROM employee e
INNER JOIN cteavgsalary cte ON e.deptid = cte.deptid
AND e.salary > cte.avgsalary
這里 cteavgsalary 將是一個表格,它將記錄部門明智的平均工資,然后你在特定部門 ID 上進行該 CTE 的內部連接
它將為您提供您正在尋找的確切輸出。
uj5u.com熱心網友回復:
這為您提供了部門的工資和平均工資。
Select deptid, avg(salary) as dept_avg
From employee
Group by deptid
這給了你高于平均水平的
然后你重新加入以找到你想要的。
select e.empid, e.deptid, e.salary
FROM emplyee e
JOIN (
Select deptid, avg(salary) as dept_avg
From employee
Group by deptid
) sub on sub.deptid = e.deptid
WHERE e.salary < sub.dept_avg
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/363703.html
標籤:sql-server
下一篇:觸發SQLServer表的更新
