访问:计算2列中的出现次数

时间:2018-10-01 14:13:33

标签: ms-access

我正在工作的数据库上,我需要找出一种Access来计算分配给每个员工的项目数量的方法。项目分配了1或2名员工,而我的老板需要能够快速计算出每个人正在处理多少个项目。下面是一个示例表:

Project     Employee 1  Employee 2

Project A    John Doe    Jane Doe

Project B    Jane Doe    Sam Smith

Project C    Jane Doe    John Doe

Project D    Sam Smith   Anna Smith

Project E    Anna Smith  John Doe

这是我要寻找的结果:

**Employee     # of Projects**

John Doe             3

Jane Doe             3

Sam Smith            2

Anna Smith           2

2 个答案:

答案 0 :(得分:2)

您所描述的表可能不是存储数据的最佳方法,我认为这只会使您的工作更加困难。关系数据库的价值在于,您可以将数据存储在不同的表中,但是基于主/外键进行关联,这使得拉动报告(如您所描述的报告)变得非常容易。在我看来,该表以前可能已经存在于Excel中,现在我将花一些时间在Access中建立关系,这将为您节省时间和以后的麻烦。我建议创建3个单独的表:雇员,项目和项目雇员分配。

employee表应具有3个字段:EmployeeID,应在“设计”视图中将其设置为AutoNumber,然后选择它们作为主键,First Name和Last Name,这两个都是短文本字段。该EmployeeID字段将在项目员工分配表中引用。

projects表应具有2个字段:ProjectID(在设计视图中也设置为AutoNumber并选择为主键)和ProjectName(也将是短文本字段)。您还可以添加其他字段,也许以后使用ProjectDescription的文本字段会有所帮助。

Project-Employee Assignments表应具有2个字段:EmployeeID和ProjectID。如果您不熟悉一对一,一对多和多对多的关系,我建议您向上查找-您正在描述项目与员工之间的多对多关系,是,一个项目可以有很多员工,而一个员工可以参与很多项目。该表用于建立员工与项目之间的关系。

从此处转到数据库工具选项卡,然后选择关系。您需要在EmployeeID字段的Employees表和Assignments表之间建立一对多关系。您还需要在ProjectID字段的Projects表和Project-Employee Assignments表之间建立一对多关系。

在“工作分配”表中输入项目与员工之间的每个关系。如果您有一个简短的项目和员工列表,则可以直接在表中执行此操作,但是我建议创建一个带有2个组合框的表单,以分别从现有项目和员工列表中进行选择。有许多关于创建组合框的教程,这些组合框显示信息列,例如员工姓名,但将ID号保存到表中。搜索“将组合框绑定到主键,但显示说明字段”作为示例。

最后,创建一个查询以计算每个员工的项目。您应该包括“雇员”表以及“项目-雇员分配”表。从雇员表中选择名字和姓氏。从“项目-员工分配”表中选择两列(“ EmployeeID”和“ ProjectID”)。取消单击“显示”以获得EmployeeID。右键单击查询中的任意位置以获取更多选项的菜单,然后单击总计的sigma。将EmployeeID,FirstName和LastName的总计设置为“ Group By”,将ProjectID设置为“ Count”,然后保存查询。运行查询并享受总计!

答案 1 :(得分:1)

伊丽莎白·哈姆(Elizabeth Ham)的答案很彻底,我建议您听从她的建议,但是知道有时我们没有时间进行彻底的检查,因此这里有一些有关如何从给定表结构中获取结果的说明。正如伊丽莎白和我指出的那样(在我的评论中),如果表完整且已正确规范化,那么单个查询就可以获取所需的数据。


由于要统计多个雇员列,因此您需要至少两次连接给定表,每次分组在不同的列上并使用不同的别名。可以使用可视化的“设计视图”来执行此操作,但是通常使用SQL文本在StackOverflow上发布问题和答案通常会更容易,这就是下面的内容。只需将以下代码粘贴到查询的SQL视图中,即可在SQL视图和设计视图之间切换。

将以下SQL语句保存为两个单独的命名查询:[ProjectCount1][ProjectCount2]。保存它们可以让您在其他查询中多次引用这些查询(而无需嵌入冗余子查询):

SELECT P.[Employee 1] As Employee, Count(P.Project]) As ProjectCount
FROM Project As P
GROUP BY P.[Employee 1];

SELECT P.[Employee 2] As Employee, Count(P.[Project]) As ProjectCount
FROM Project As P
GROUP BY P.[Employee 2];

现在创建一个UNION查询,以便从两个源列中创建唯一的雇员列表。 UNION会自动仅保留不同的值(即删除重复项)。 (顺便说一句,UNION ALL将从两个表中返回所有行,包括重复项。)将此查询另存为[Employees]:

SELECT Employee FROM [ProjectCount1]
UNION
SELECT Employee FROM [ProjectCount2]

最后,将他们全部合并到一个独特的员工列表中,每个员工的项目总计:

SELECT 
    E.Employee As Employee, nz(PC1.ProjectCount, 0) + nz(PC2.ProjectCount, 0) As ProjectCount
FROM 
    ([Employees] AS E LEFT JOIN [ProjectCount1] As PC1 
         ON E.[Employee] = PC1.[Employee])
    LEFT JOIN [ProjectCount2] As PC2 
        ON E.[Employee] = PC2.Employee
ORDER BY E.[Employee]

注释1 :函数nz()将空值转换为给定的非空值,在这种情况下为0(零)。这样可以确保即使雇员仅出现在一个列中(因此在另一列中具有空值),您也将获得有效的总和。

注释2 :如果该解决方案在原始表中同时列为[Employee 1]和[Employee 2],则该解决方案将对雇员进行重复计算。我假设存在适当的约束条件来排除这种情况,但是如果需要,可以对第二个查询[ProjectCount2]进行 self join 以排除此类重复条目。

注释3 :如果您确实决定遵循Elizabeth的建议并且在现有结构中已经有很多数据,则上述查询对于为新的规范化表生成数据也很有用。结构体。例如,您可以将上述UNION查询中的唯一雇员列表直接插入到新标准化的[Employee]表中。

相关问题