Ms-Access:从2个表中计算

时间:2014-06-12 12:18:55

标签: sql ms-access

我在数据库中有两个表

EmployeeStafflink

我需要按以下格式检索每位经理的员工人数

Output

我一直在努力调整另一个问题的答案

SELECT bankNo AS "Bank Number", 
COUNT (*) AS "Total Branches" 
FROM BankBranch 
GROUP BY bankNo

作为

SELECT COUNT (*) AS StaffCount , 
Employee.Name AS Name 
FROM Employee, Stafflink 
GROUP BY Name

当我看着Group BY时,我想我应该通过Manlink在Stafflink表中进行分组。

此查询的输出如下所示

enter image description here

所以它正确计数但是你可以看到它远远不是我需要的输出。 任何建议将不胜感激。

4 个答案:

答案 0 :(得分:3)

您需要加入Employee和Stafflink表。您的FROM子句看起来应如下所示:

FROM Employee INNER JOIN StaffLink ON Employee.ID = StaffLink.ManID

答案 1 :(得分:0)

您必须两次加入Employee表才能获得经理

下的员工摘要
select count(*) as StaffCount,Manager.Name
from Employee join Stafflink on employee.Id = StaffLink.EmpId
join Employee as Manager on StaffLink.ManId = Manager.Id
Group by Manager.Name

答案 2 :(得分:0)

假设您想要学习如何在MS Access中使用SQL,建议您如何加入的答案是正确的。但是有一种方法可以使用ACCESS GUI来设计查询,这比学习SQL更简单。

当涉及多个表时使用GUI的关键是要意识到必须在关系管理器中定义表之间的关系。一旦你这样做,设计你所追求的查询是一块蛋糕,只需点击即可。

在您的情况下,棘手的是两个表之间存在两种关系。一个关系将EmpId链接到ID,另一个链接将ManId链接到ID。

但是,如果您想学习SQL,那么这个快捷方式将是一个题外话。

答案 3 :(得分:0)

如果您没有在表格之间指定连接,则将构建所谓的笛卡尔积,即一个表中的每个记录将与另一个表中的每个记录配对。如果一个表中有7个记录而另一个表中有10个记录,则在分组之前将获得70对(即行)。这就解释了为什么每个经理名字的数量为7。

除了加入表之外,我建议你对经理ID进行分组,而不是经理名称。已知经理ID对于每个经理是唯一的,但不是名称。然后,您需要另外对名称进行分组,因为名称位于选择列表中或者对名称应用聚合函数。每个额外的分组都会降低查询速度;因此我更喜欢聚合函数。

SELECT
    COUNT(*) AS StaffCount,
    FIRST(Manager.Name) AS ManagerName
FROM
    Stafflink
    INNER JOIN Employee AS Manager
        ON StaffLink.ManId = Manager.Id
GROUP BY
    StaffLink.ManId

我不知道它是否会带来性能差异,但我更喜欢在StaffLink.ManId上而不是在Employee.Id上进行分组,因为StaffLink是此处的主要表格而Employee 1}}仅用作此查询中的查找表。