MS Access Query / Design - PullRequest
       9

MS Access Query / Design

0 голосов
/ 04 октября 2018

У меня есть таблица с экземплярами событий сотрудников.Каждая строка имеет ID, имя сотрудника и eventNumber среди других данных.Я хотел бы найти и подсчитать все случаи, когда «имя сотрудника» встречается в этой таблице, подсчитав, таким образом, все события, связанные с этим сотрудником.

Если есть 15 уникальных сотрудников, я думаю, что я мог бы написать 15 отдельных запросов, чтобы сделать это.Но есть ли более эффективный способ сделать это?

Кроме того, я хотел бы отобразить общее количество событий для каждого сотрудника, которые возвращаются из этих запросов, в другой таблице или визуальном отображении некоторых видов.Вот где я действительно не знаю, что делать, потому что я мало использовал доступ, но гораздо лучше знаком с SQL.

Спасибо всем, кто мог бы уделить время советам.Я очень ценю это

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Это довольно просто в SQL.Вы можете GROUP BY по имени сотрудника, чтобы получить общий счет.Добавление GROUP BY в оператор SQL позволит вам выполнять агрегатные функции для одного или нескольких столбцов.Агрегатные функции включают COUNT, SUM, MIN и MAX.

Документацию о GROUP BY можно найти здесь: https://support.office.com/en-us/article/group-by-clause-84eeb766-25d2-4aa1-8eea-002bb65ef3a0

Несколько примеров:

Этот запрос группируется поEmployeeName, чтобы получить общее количество всех строк в таблице по имени сотрудника.

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

Кроме того, если вы хотите получить значения по вечерним именам и именам сотрудников, вы можете сгруппировать их по имени сотрудника и по вечернему времени.Затем в запросе будет показано количество событий каждого типа для каждого имени сотрудника.

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, то вы не сможете ВЫБРАТЬ столбцы, которые не являются GROUPing 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 говорят, что вы хотите свернуть несколько строк и отобразить одно значение для всех этих строк, однако вы также просите просмотреть значение, которое не является частью группы и отличается для каждой строки в таблице..

0 голосов
/ 04 октября 2018

что-то вроде

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