【问题标题】:MS Access Query / DesignMS Access 查询/设计
【发布时间】:2018-10-06 01:35:17
【问题描述】:

我有一张包含员工事件实例的表格。每行都有一个 ID、员工姓名和 eventNumber 以及其他数据。我想查找并计算此表中出现“员工姓名”的所有实例,从而计算与该员工相关的所有事件。

如果有 15 个不同的员工,我想我可以编写 15 个单独的查询来完成这项工作。但是,有没有更有效的方法来做到这一点?

另外,我想在另一个表或某种视觉显示中显示从这些查询返回的每个员工的事件总数。这是我真的不知道该怎么做的地方,因为我没有太多使用访问但对 SQL 更熟悉。

感谢所有愿意花时间提供建议的人。非常感谢

【问题讨论】:

  • 添加一些样本数据和想要的结果

标签: sql ms-access vba


【解决方案1】:

这在 SQL 中相当简单。您可以按员工姓名分组以获取总数。将 GROUP BY 添加到 SQL 语句将允许您对一个或多个列执行聚合函数。聚合函数包括 COUNT、SUM、MIN 和 MAX。

关于 GROUP BY 的文档可以在这里找到: https://support.office.com/en-us/article/group-by-clause-84eeb766-25d2-4aa1-8eea-002bb65ef3a0

几个例子:

此查询按员工姓名分组,以按员工姓名获取表中所有行的总数。

SELECT
    EmployeeName
    , COUNT(*) AS NumberOfEvents
FROM table
GROUP BY EmployeeName

此外,如果您想按 eventid 和员工姓名获取计数,您可以按员工姓名和 eventid 进行分组。然后查询将显示每个员工姓名的每种类型事件的计数。

SELECT
    EmployeeName
    , EventId
    , COUNT(*) AS NumberOfEvents
FROM table
GROUP BY 
    EmployeeName
    , EventId

如果您想过滤结果以便只显示一名员工“Leroy Jenkins”,那么您也可以添加 WHERE 子句,如下所示:

SELECT
    EmployeeName
    , COUNT(*) AS NumberOfEvents
FROM table
WHERE EmployeeName = "Leroy Jenkins"
GROUP BY EmployeeName

回应@WesG 要求澄清的评论。

聚合函数(如 COUNT)会“汇总”表中的几行并为这些行显示单个值。如果您的 SELECT 语句不包含 GROUP BY 子句,则聚合函数正在处理表中的所有行。

如果您确实有一个 GROUP BY 子句,那么聚合函数将对您分组的列中所有具有相同值的每组行起作用。此外,如果您包含 GROUP BY 子句,那么您可能不会选择您没有 GROUP BY 的列。

所以,如果你有这样的表:

CREATE TABLE [dbo].[AuditTrailLogs](
    [Id] [bigint] IDENTITY(1,1) NOT NULL,
    [EventType] nvarchar(20) NOT NULL,
    [EventId] [int] NOT NULL,
    [Message] [nvarchar](max) NULL,
    [WhoDidIt] [nvarchar](50) NULL,
    [WhenOccurredUtc] [datetime] NOT NULL,
    [EntityPayload] [nvarchar](max) NULL,
)

您可以像这样计算表中的总行数:

SELECT COUNT(*) AS NumLogEntries
FROM dbo.AuditTrailLogs

如果您想按创建条目的用户计算行数:

SELECT WhoDidIt, COUNT(*) AS NumLogEntries
FROM dbo.AuditTrailLogs
GROUP BY WhoDidIt

然后 Access 会将表中的行拆分为多个组,并且 COUNT 将返回表中 WhoDidIt 的每个不同值的日志条目数。

如果您想查看创建日志条目的用户的总数事件类型,那么您可以按两列分组:

SELECT WhoDidIt, EventType, COUNT(*) AS NumLogEntries
FROM dbo.AuditTrailLogs
GROUP BY WhoDidIt, EventType

现在,结果集中每一行中的 NumLogEntries 将是每个用户所做的每种事件类型的总和。

但是,如果您尝试执行以下操作,Access 会抱怨:

SELECT Id, WhoDidIt, EventType, COUNT(*) AS NumLogEntries
FROM dbo.AuditTrailLogs
GROUP BY WhoDidIt, EventType

如果你仔细想想,这个查询是没有意义的。 COUNT 聚合函数表示您希望汇总多行并为所有这些行显示一个值,但是,您还要求查看一个不属于组的值并且对于表中的每一行都不同.

【讨论】:

  • 很好的答案...虽然,由于问题被标记为 Access,OP 可以使用查询设计器,这可能更容易。
  • @Zack 感谢您的反馈。不过,我认为这可能是个人喜好问题。我从未发现查询设计器比 SQL 编辑器更易于使用。
  • 就我个人而言,我讨厌 Access SQL 编辑器(没有语法颜色、自动完成,而且您的格式总是被剥离)---如果我必须在 Access 中编写 SQL 查询,我会使用更好的工具并将其复制过来(并将 SQL 保存在外部文件中)。
  • 同意。与 SQL Management Studio 等合法编辑器相比,Access SQL 编辑器很糟糕,但我仍然更喜欢输入我想要使用 GUI 构建查询的确切查询。
  • 非常感谢大家的建议和帮助!查询设计器似乎是一个不错的工具,但我只是觉得在 sql 编辑器中编写查询更舒服。
【解决方案2】:

类似

select employeeName, count(*) as nbEvents  
from myTable
group by employeeName

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多