2014-11-22 4 views
0

У меня есть таблица выглядит следующим образом:агрегатные функции в Microsoft Access

userid checktime    checktype 
------------------------------------------ 
213  10/30/2014 2:06:09 PM O 
592  10/30/2014 2:28:04 PM I 
714  10/30/2014 10:02:59 AM O 
714  10/30/2014 10:03:01 AM O 
147  10/30/2014 1:05:15 PM O 
147  10/30/2014 1:05:20 PM I 
147  10/30/2014 1:13:17 PM O 
147  10/30/2014 1:13:23 PM I 
213  10/30/2014 11:56:11 AM I 
147  10/30/2014 1:08:26 PM O 
147  10/30/2014 1:08:32 PM I 

Как я могу выбрать пользователей, которые имеют запись с CheckType «я» или только с CheckType из «O» только, а не с обоими? Пожалуйста, я хочу, чтобы запрос был совместим с Microsoft Access.

ответ

1

Начнем с создания запроса, который возвращает одну строку для каждой комбинации идентификатор пользователя и CheckType:

SELECT DISTINCT h.userid, h.checktype 
FROM tblHani AS h 
WHERE (((h.checktype) In ('I','O'))); 

Примечание Если CheckType может быть только либо я или О во всех строках (no Nulls, строка нулевой длины или другие значения), что условие WHERE не требуется.

Затем вы можете использовать его в качестве источника подзапроса для другого, где вы сосчитать CheckType значения для каждого идентификатору пользователя, и держать только те, количество которых 1:

SELECT sub.userid, Count(sub.checktype) AS CountOfchecktype 
FROM 
    (
     SELECT DISTINCT h.userid, h.checktype 
     FROM tblHani AS h 
     WHERE (((h.checktype) In ('I','O'))) 
    ) AS sub 
GROUP BY sub.userid 
HAVING (((Count(sub.checktype))=1)); 

С вашими данными выборки в таблица с именем tblHani, это выход я получаю в Access 2010:

userid CountOfchecktype 
------ ---------------- 
    592    1 
    714    1 
+0

Уважаемый Ханс; Спасибо за ваш пост, приведенная выше таблица - это мир таблицы с записью 95000 в моем доступе db, который используется для проверки регистрации и проверки сотрудников в компании. Мне нужен запрос для показа сотрудникам, которые проверили утром, но забыл проверить, и наоборот, что означает, что сотрудники имеют только тип проверки «I» или «O», запрос выше не привел этих людей, я попробовал это во многих случаях. –

+0

Ваш вопрос задан * «выберите пользователей, у которых есть запись только с типом« I », или с контрольным типом« O », но не с обоими *. Именно это я и дал вам. Если это не то, что вы хотите, исправьте вопрос. – HansUp

0

Вы можете использовать тот факт, что логический TRUE представлен как -1, а логический FALSE равен 0. Таким образом, вы подсчитываете, сколько раз type = «I» истинно и сколько раз type = «O» - true. Группы, которые по ID пользователя и показывают только те, кто не равен:

SELECT User, Sum([type]="i") AS ins, Sum([type]="o") AS outs, Abs(Sum([type]="i")-Sum([type]="o")) AS diff 
FROM myTable 
GROUP BY User 
HAVING (((Abs(Sum([type]="i")-Sum([type]="o")))>0)); 
Смежные вопросы