这在 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 聚合函数表示您希望汇总多行并为所有这些行显示一个值,但是,您还要求查看一个不属于组的值并且对于表中的每一行都不同.