访问:计算 2 列中的出现次数 [关闭]

Posted

技术标签:

【中文标题】访问:计算 2 列中的出现次数 [关闭]【英文标题】:Access: Counting Number of Occurrences in 2 Columns [closed] 【发布时间】:2018-10-01 14:13:33 【问题描述】:

我正在开发一个工作数据库,我需要找出一种方法让 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

【问题讨论】:

您需要有关如何执行此操作的说明还是需要 sql 查询?请在问题中澄清? 还提供有关表格的更多详细信息,以便能够回答的人使用与您的查询相关的相关字段。如果您担心,请更改您的字段名称! 我同意其他 cmets,但更具体地说,是否还有另一个包含唯一员工列表的“员工”表?这将使查询更容易构建(并指示正确规范化的数据库)。无论哪种方式,您都需要对项目的每一列进行单独的求和,但如果已经有另一个表具有唯一名称,则可以避免将结果合并到唯一员工列表中的额外步骤。 太宽泛了?我认为那些标记这个问题的人误解了过于宽泛的答案与实际问题之间的区别。这个问题缺乏一些细节,但我能够直接回答几个问题。尽管 OP 的数据库没有标准化,但我在问题中概述的技术是经常出现的技术,值得在答案中分享。 【参考方案1】:

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

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

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

Project-Employee Assignments 表应该有 2 个字段:EmployeeID 和 ProjectID。如果您不熟悉一对一、一对多和多对多关系,我建议您查一下——您正在描述项目和员工之间的多对多关系,即也就是说,一个项目可以有多个员工,一个员工可以参与多个项目。该表的存在是为了建立员工和项目之间的关系。

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

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

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

【讨论】:

非常感谢!我会试试这个。非常感谢您的宝贵时间。【参考方案2】:

Elizabeth Ham 的回答非常透彻,我建议听从她的建议,但知道有时我们没有时间进行彻底检查,这里有一些关于如何从给定表结构中获取结果的说明。正如 Elizabeth 和我指出的那样(在我的评论中),如果表是完整的并且正确规范化,则单个查询可能会获得请求的数据。


由于您需要统计多个员工列,因此您需要至少连接给定表两次,每次都在不同的列上分组并使用不同的别名。可以使用可视化设计视图来执行此操作,但是使用 SQL 文本在 *** 上发布问题和答案通常更容易,因此如下所示。只需将以下代码粘贴到查询的 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:如果员工在原始表中同时列为 [员工 1] 和 [员工 2],此解决方案将重复计算该员工。我假设有适当的限制来排除这种情况,但如果需要,可以在第二个查询 [ProjectCount2] 上执行 self join 以排除此类双重条目。

注意 3:如果您决定听从 Elizabeth 的建议,并且现有结构中已有大量数据,则上述查询也可用于为新的规范化表生成数据结构体。例如,您可以将上述 UNION 查询中的唯一员工列表直接插入到新规范化的 [Employee] 表中。

【讨论】:

谢谢!!我非常感谢您花时间回答我的问题。我会试试你的答案和上面伊丽莎白的答案。

以上是关于访问:计算 2 列中的出现次数 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

根据第一列中的唯一值计算第二列中值的出现次数

计算数据框列中列表中单词的出现次数

计算 pyspark 数据框中的出现次数

如何计算某个meta_key在列中出现的meta_value的次数?

计算 json 对象中键的出现次数 - IMPALA/HIVE

Pandas - 计算并获取列中字符串值的唯一出现次数