2012-05-29 99 views
1

我正在尝试编写一个查询来获取每个部门的员工数。这是我正在使用内部查询。 我面临什么样的问题是我需要过滤掉其计为小于10 这里是我的查询如何looks-如何根据内部查询添加where子句

SELECT 
    DPT.ID, 
    DPT.NAME, 
    (SELECT COUNT(1) FROM EMPLOYEE E WHERE E.DEPARTMENT_ID=DPT.ID) EMP_COUNT 
FROM 
    DEPARTMENT DPT 
WHERE 
    EMP_COUNT >=10; -- this part is not working 

任何人都可以提出一些我可以代替EMP_COUNT >=10更换记录? 在此先感谢。

回答

4

为什么使用子查询?这大概是大多数RDBMS-ES更快

SELECT  DPT.ID 
,   DPT.NAME 
,   COUNT(*) EMP_COUNT 
FROM  DEPARTMENT DPT 
INNER JOIN EMPLOYEE E 
ON   DPT.ID = E.DEPARTMENT_ID 
GROUP BY DPT.ID 
,   DPT.NAME 
HAVING  COUNT(*) >= 10; 
+0

这是一个很好的建议!但是这会为count> = 0工作吗? – Kshitij

+0

@Kshitij:如果只有你切换到'LEFT JOIN' *(编辑:)*并将COUNT(*)改为像COUNT(E.ID)'这样的东西。 –

+0

计数不能是负数。所以,如果你想要的话,只要删除'HAVING'部分。如果您希望有0名员工的部门,请按@Andriy的建议,使用'LEFT JOIN'和'COUNT(E.DEPARTMENT_ID)'而不是'COUNT(*)'。 –

1
SELECT DPT.ID, DPT.NAME, DEPT_EMP_COUNT 
FROM DEPARTMENT DPT, (SELECT E.DEPARTMENT_ID , COUNT(1) AS DEPT_EMP_COUNT 
         FROM EMPLOYEE E 
         GROUP BY E.DEPARTMENT_ID) EMP_COUNT 
WHERE EMP_COUNT.DEPARTMENT_ID = DPT.ID AND DEPT_EMP_COUNT > 10; 
+0

thanks..this也是行之有效 – Kshitij

0

试试这个

select dept.deptId, 
dept.deptName, 
count(emp.empid) as numb_of_emps 
from department dept inner join employee emp 
on dept.deptid = emp.deptid 
group by dept.deptid,dept.deptName 
having count(emp.empid) >= 10