返回错误答案的SQL计数(*)
以下脚本应返回这些部门的名称和员工人数,营销、执行和销售部门有“0”名员工,但返回的值不是“0”,而是“1”。我怎样才能纠正它返回错误答案的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
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中,我从来不知道它的存在!!!是啊,小提琴棒极了。它是由