2011-05-25 127 views
0

(DepartID,DepName)子查询问题

员工(名称,DepartID)

我需要的是员工与DepName系计数。

回答

1

如果您正在使用SQL Server版本或以上,这里是另一个可能的方式让员工按部门计数。 。

SELECT  DPT.DepName 
     , EMP.EmpCount 
FROM  dbo.Department DPT 
CROSS APPLY (
       SELECT COUNT(EMP.DepartId) AS EmpCount 
       FROM dbo.Employees EMP 
       WHERE EMP.DepartId = DPT.DepartId 
      ) EMP   
ORDER BY DPT.DepName 

希望有所帮助。

样品测试查询输出:

Output

1

我会使用outer join而不是子查询。

SELECT d.DepName, COUNT(e.Name) 
FROM Department d 
LEFT JOIN Employees e ON e.DepartID = d.DepartID 
GROUP BY d.DepartID, d.DepName 
+0

子查询较好,避免了排序上DepName – Magnus 2011-05-25 18:11:37

+0

@Magnus机会是'DepartID'将是PK /聚簇索引键,也不会需要任何形式。编辑:这是一个警察的答案,虽然有趣的一般点我会做一些测试。 – 2011-05-25 18:17:55

+0

我想,既然你是由DepartID和DepName分组而不是只有DepName – Magnus 2011-05-25 18:26:52

1
SELECT d.DepName, COUNT(e.Name) 
    FROM Department d 
     LEFT JOIN Employees e 
      ON d.DepartID = e.DepartID 
    GROUP BY d.DepName 
+0

这假设部门名称是唯一的。 'DepartID'似乎是一个更好的事情'分组' – 2011-05-25 16:31:03

1

无需子查询。

SELECT dep.DepName, COUNT(emp.Name) 
FROM DepName dep 
    LEFT OUTER JOIN Employees emp ON dep.DepartID = emp.DepartID 
GROUP BY dep.DepName 
+0

这假设部门名称是唯一的。 ''bypartid'似乎是一件更好的事情 – 2011-05-25 16:32:18

1
SELECT COUNT(DISTINCT Name) FROM 
Department AS d, Employees AS e 
WHERE d.DepartID=e.DepartID AND d.DepName = '$thename' 
1

,并避免使用group by,节省您的queryplan排序操作:

SELECT 
    Department.DepName, 
    (SELECT COUNT(*) 
    FROM Employees 
    WHERE Employees.DepartID = Department.DepartID) 
FROM 
    Department