2012-12-10 119 views
-1

我可以得到員工的數量和平均工資,但是當我嘗試獲得額外的選擇時,選擇列出支付的員工數量低於平均水平,則失敗。如何獲得薪水低於平均工資的所有員工?

select count(employee_id),avg(salary) 
from employees 
Where salary < avg(salary); 
+0

我想你需要一個HAVING子句而不是WHERE子句。 – ceejayoz

+3

請使用真正的英語句子,而不是您的標題最初組成的關鍵字散亂的列表。 – meagar

回答

3
select count(*), (select avg(salary) from employees) 
from employees 
where salary < (select avg(salary) from employees); 
1
select TotalNumberOfEmployees, 
      AverageSalary, 
      count(e.employee_id) NumberOfEmployeesBelowAverageSalary 
    from (
      select count(employee_id) TotalNumberOfEmployees, 
        avg(salary) AverageSalary 
       from employees 
     ) preagg 
left join employees e on e.salary < preagg.AverageSalary 
group by TotalNumberOfEmployees, 
      AverageSalary 

注:我使用了LEFT JOIN,所以如果你有3名相等的員工,它會顯示0,而不是任何結果(以下低於平均一個人)。

+0

+1雖然我仍然試圖解決這個問題是否有合理的方法來使用窗口函數;) – 2012-12-10 20:48:01

1

問題是AVG是一個聚合函數。 SQL不夠聰明,無法弄清楚如何在行內混合聚合結果。傳統的方式是使用連接:

select count(*), avg(e.salary), 
     sum(case when e.salary < const.AvgSalary then 1 else 0 end) as NumBelowAverage 
from employees e cross join 
    (select avg(salary) as AvgSalary from employees) as const 
+0

+1您也可以在此特例中使用交叉連接作爲過濾器和簡單計數(*)因爲OP沒有要求計算僱員總數。 – 2012-12-10 20:49:13

1

您不清楚在結果集中想要哪些列,這就很難回答您的問題。明確問題可以提高答案的質量。

你似乎想3個事實:

  1. 員工人數。
  2. 平均工資。
  3. 收入低於平均工資的員工人數。

你展現一個查詢其確實爲前兩個事實工作:

SELECT COUNT(*) AS NumberOfEmployees, 
     AVG(Salary) AS AverageSalary 
    FROM Employees 

什麼COUNT(*)COUNT(Employee_ID)之間的區別?不同之處在於後者只對Employee_ID列中存在非NULL值的行進行計數。一個好的優化器會認識到Employee_ID是一個主鍵並且不包含NULL值,查詢也是一樣的。但COUNT(*)更傳統,對優化器的依賴性更低。

其他統計可以在選擇列表中一個簡單的值通過一個子查詢生成:

SELECT COUNT(*) AS NumberOfEmployees, 
     AVG(Salary) AS AverageSalary, 
     (SELECT COUNT(*) 
      FROM Employees 
     WHERE Salary < (SELECT AVG(Salary) FROM Employees) 
     ) AS NumberOfEmployeesPaidSubAverageWages 
    FROM Employees 

在許多情況下,這是不恰當的寫子查詢那樣,但是對於指定查詢的解釋,這很好。

+0

+1比我的方式更清晰 – 2012-12-11 06:11:52

0
select * from <table name> where salary < (select avg(<salary column name) from <table name>); 

例子:

select * from EMPLOYEE where sal < (select avg(emp_sal) from EMPLOYEE); 
+1

你應該詳細說明你的答案。 –

0
SELECT e.ename,e.deptno,e.sal,d.avg 
FROM emp e,(SELECT deptno, avg(sal) avg 
      FROM emp 
      GROUP BY deptno) d 
WHERE e.deptno=d.deptno 
AND 
e.sal < d.avg 
+1

歡迎來到Stack Overflow!花點時間閱讀幫助中心的[編輯幫助](// stackoverflow.com/editing-help)。堆棧溢出的格式與其他站點不同。 – FrankerZ

+2

此外,雖然此代碼片段可能會解決問題,但[包括解釋](// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)確實有助於提高帖子的質量。請記住,您將來會爲讀者回答問題,而這些人可能不知道您的代碼建議的原因。也請儘量不要使用解釋性註釋來擠佔代碼,因爲這會降低代碼和解釋的可讀性! – FrankerZ

相關問題