2009-09-25 75 views
2

我有以下格式2個表格更高:SQL查詢列表那些低於平均

  • 員工(僱員,EmployeeName,DepartmentID的)
  • 部門(DepartmentID的,DEPTNAME)

在每個部門工作的僱員人數多於部門僱員人數的平均數。

即時通訊尋求結果的格式如下:

Dept Name | Num of Emp 
engineering | 10 
science  | 15 

回答

1

,因爲員工可以在只有一個部門,員工的平均數量就是部門總數中員工總數。所以如何:

SELECT dept.name, COUNT(emp.id) AS employeeCount 
FROM   emp INNER JOIN dept ON emp.deptId = dept.id 
GROUP BY dept.name 
HAVING  (COUNT(emp.id) > 
(SELECT COUNT(*) FROM emp)/
(SELECT  COUNT(*) FROM dept)) 
+0

這當然假設有0名僱員的部門對平均值有貢獻。 – Quassnoi 2009-09-25 15:18:55

+0

@Quassnoi:大多數平均值不包括人口中的零點嗎? – 2009-09-26 20:19:47

2
SELECT deptName, cnt 
FROM (
     SELECT departmentID, COUNT(*) AS cnt 
     FROM employee 
     GROUP BY 
       departmentID 
     HAVING COUNT(*) >= 
       (
       SELECT AVG(cnt) 
       FROM (
         SELECT COUNT(*) AS cnt 
         FROM employee 
         GROUP BY 
           departmentID 
         ) 
       ) 
     ) e 
JOIN departments d 
ON  d.departmentID = e.departmentID 

Oracle,您可以使用分析功能,這是更優雅:

SELECT DeptName, cnt 
FROM (
     SELECT q.*, AVG(cnt) OVER() AS acnt 
     FROM (
       SELECT departmentID, COUNT(*) AS cnt 
       FROM employee 
       GROUP BY 
         departmentID 
       ) q 
     ) e 
JOIN departments d 
ON  d.departmentID = e.departmentID 
WHERE cnt >= acnt 
+0

你不需要在最外面的SELECT的GROUP BY,所以HAVING知道要過濾? – 2009-09-25 14:38:26

+0

當然,我這樣做,而不是複製到外部查詢:) – Quassnoi 2009-09-25 14:39:50

+0

我無法得到任何工作...即時通訊運行在oracle中。 其中是對部門表中部門名稱的引用? – lukemh 2009-09-25 14:43:50