返回错误答案的SQL计数(*)

返回错误答案的SQL计数(*),sql,Sql,以下脚本应返回这些部门的名称和员工人数,营销、执行和销售部门有“0”名员工,但返回的值不是“0”,而是“1”。我怎样才能纠正它 select Department, Departments.DepartmentID, count(*) as 'NumOfEmps' from Departments left join Employees on Employees.DepartmentID = Departments.DepartmentID group by Departments.Dep

以下脚本应返回这些部门的名称和员工人数,营销、执行和销售部门有“0”名员工,但返回的值不是“0”,而是“1”。我怎样才能纠正它

select Department, Departments.DepartmentID, count(*) as 'NumOfEmps' 
from Departments
left join Employees
on   Employees.DepartmentID = Departments.DepartmentID
group by Departments.DepartmentID,Department

您不能在一个查询中完成所有操作。您需要一个子查询来首先获取员工数量,然后使用聚合结果获取相关部门信息(姓名等):

SELECT Department, Departments.DepartmentID, t.NumOfEmps
FROM Departments
LEFT JOIN (SELECT DepartmentID, count(*) as 'NumOfEmps'
           FROM Employees
           GROUP BY DepartmentID) t
  ON t.DepartmentID = Departments.DepartmentID
我对你的模式做了一些假设,因为它没有列出。列名可能有点不合适,但这是一般的想法。希望有帮助。

不要使用
Count(*)
计算你想计算的东西,即员工

Count(*)
对整行进行计数。因为在计算(*)时,部门中的每个部门都会有至少一条记录,所以您总是会得到至少1条记录

SELECT d.Department, d.DepartmentID, count(e.EmployeeID)
FROM Departments d
    LEFT JOIN employees e
    ON d.DepartmentID = e.DepartmentID
GROUP BY 
 d.Department, d.DepartmentID

返回1是因为您使用的是左联接,如果Departments表中有记录,当然会返回一行,即使Employees表中没有记录。(@Yuck发布了我剩下的答案。既然他比我抢先一步,我就留下这条评论来解释为什么你的结果中的计数是1,而你期望的是0。)@DavidStratton,如果只
count
接受了
*
以外的东西,那就好了?无需使用子查询即可获得员工人数-我想原始查询所需的全部内容是将
count(*)
count(Employees.id)
@SamDufel Force of havity。通常这类查询比较复杂,所以当我看到它弹出时,首先想到的是我的方法。不过接得不错@ConradFrix修复了,这是一个复制/粘贴错误。很好的一个,很短,还有一个演示,也是在SQLFiddle中,我从来不知道它的存在!!!是啊,小提琴棒极了。它是由