Как выбрать запрос из числа записей более 2 с помощью настраиваемого столбца (опция) в MS Access

Я пытаюсь выбрать запрос из числа строк более 2 на основе идентификатора, ДАТЫ и ОПЦИИ в MS Access.

поэтому, если в столбце параметров указано «НЕТ», запись более 2 не включена в мой код запроса sql.

Что-то не так с моим SQL-кодом?

поэтому мой пост отличается от ссылки ниже

ссылка

Пожалуйста, направь меня

Стол Absen

ИДЕНТИФИКАТОР ДАТА ВРЕМЯ ВХОД ВАРИАНТ 5008 28 апреля 24 года 08:00 В 5008 28 апреля 24 года 17:00 ВНЕ 5009 29 апреля 24 года 08:00 В 5009 29 апреля 24 года 17:00 ВНЕ 5009 29 апреля 24 года 17:00 ВНЕ НЕТ 5010 28 апреля 24 года 08:00 В 5011 30 апреля 24 года 08:00 В 5011 30 апреля 24 года 08:00 В 5011 30 апреля 24 года 17:00 ВНЕ

Стол MASTERID

ИДЕНТИФИКАТОР ИМЯИД ИДЕНТИФИКАТОР ПОЗИЦИОНА 5008 А ПЕРСОНАЛ 5009 Б ПЕРСОНАЛ 5010 С ПЕРСОНАЛ 5011 Д ПЕРСОНАЛ

Я использовал этот результат кода SQL следующим образом:

SELECT a.ID, MASTERID.NAMEID, a.DATE, a.TIME, a.INOUT
FROM ABSEN AS a INNER JOIN MASTERID ON a.ID = MASTERID.ID
WHERE a.option is null and exists(select a.ID from ABSEN a2 where a.ID=a2.ID and a.DATE=a2.DATE group by a.ID and a.DATE and a.option having count(*) > 2)
ORDER BY a.ID, a.DATE, a.INOUT;

Результат из кода

ИДЕНТИФИКАТОР ИМЯИД ДАТА ВРЕМЯ ВХОД 5009 Б 29 апреля 24 года 08:00 В 5009 Б 29 апреля 24 года 17:00 ВНЕ 5011 Д 30 апреля 24 года 08:00 В 5011 Д 30 апреля 24 года 08:00 В 5011 Д 30 апреля 24 года 17:00 ВНЕ

Желаемый результат

ИДЕНТИФИКАТОР ИМЯИД ДАТА ВРЕМЯ ВХОД 5011 Д 30 апреля 24 года 08:00 В 5011 Д 30 апреля 24 года 08:00 В 5011 Д 30 апреля 24 года 17:00 ВНЕ

Таблица Absen для тестового ответа от @june7

ИДЕНТИФИКАТОР ДАТА ВРЕМЯ ВХОД ВАРИАНТ 5008 28 апреля 24 года 08:00 В 5008 28 апреля 24 года 17:00 ВНЕ 5009 29 апреля 24 года 08:00 В 5009 29 апреля 24 года 17:00 ВНЕ 5009 29 апреля 24 года 17:00 ВНЕ НЕТ 5010 28 апреля 24 года 08:00 В 5011 30 апреля 24 года 08:00 В 5011 30 апреля 24 года 08:00 В 5011 30 апреля 24 года 17:00 ВНЕ 5011 28 августа 24 г. 08:00 В 5011 28 августа 24 г. 17:00 ВНЕ 5011 29-24 августа 08:00 В 5011 29-24 августа 17:00 ВНЕ

Результат ответа @june7

ИДЕНТИФИКАТОР ИМЯИД ДАТА ВРЕМЯ ВХОД 5011 Д 30 апреля 24 года 08:00 В 5011 Д 30 апреля 24 года 08:00 В 5011 Д 30 апреля 24 года 17:00 ВНЕ 5011 Д 28 августа 24 г. 08:00 В 5011 Д 28 августа 24 г. 17:00 ВНЕ 5011 Д 29-24 августа 08:00 В 5011 Д 29-24 августа 17:00 ВНЕ

Таблица Absen для обновления ответов на тестирование от @june7 28-08-2024.

ИДЕНТИФИКАТОР ДАТА ВРЕМЯ ВХОД ВАРИАНТ 5045 12 июля 24 08:11:36 В 5045 12 июля 24 08:11:38 В 5045 12 июля 24 17:01:01 В 5045 12 июля 24 0 ВНЕ 5045 21 июня 24 года 08:16:10 В 5045 21 июня 24 года 17:04:45 ВНЕ 5045 22 июня 24 года 08:18:14 В 5045 21-мая-24 08:19:25 В 5045 21-мая-24 17:04:40 ВНЕ НЕТ

Стол MASTERID

ИДЕНТИФИКАТОР ИМЯИД ИДЕНТИФИКАТОР ПОЗИЦИОНА 5045 М ПЕРСОНАЛ

с обновлением кода ответа

SELECT a.ID, m.NAMEID, a.DATE, a.TIME, a.INOUT
FROM ABSEN AS a INNER JOIN MASTERID AS m ON a.ID = m.ID
WHERE a.ID NOT IN(select ID from ABSEN WHERE Option = "NO")
AND m.POSITIONID ='STAFF' and a.ID & [Date] IN(SELECT ID & [Date] FROM ABSEN GROUP BY ID & [Date] HAVING Count(*)>2)
ORDER BY a.ID, a.DATE, a.INOUT;

Результат Обновление ответа (нет записи)

ИДЕНТИФИКАТОР ИМЯИД ДАТА ВРЕМЯ ВХОД

со старой публикацией кода

SELECT a.ID, MASTERID.NAMEID, a.Date, a.Time, a.INOUT
FROM ABSEN AS a INNER JOIN MASTERID ON a.ID = MASTERID.ID
WHERE (((MASTERID.POSITIONID)='STAFF') AND ((a.OPTION) Is Null) AND ((Exists (select a.ID from ABSEN a2 where a.ID=a2.ID and a.DATE=a2.DATE group by a.ID having count(*) > 2))<>False))
ORDER BY a.ID, a.Date, a.INOUT;

Результат публикации старого кода

ИДЕНТИФИКАТОР ИМЯИД ДАТА ВРЕМЯ ВХОД 5045 М 12 июля 24 17:01:01 В 5045 М 12 июля 24 08:11:38 В 5045 М 12 июля 24 08:11:36 В 5045 М 12 июля 24 0 ВНЕ

🤔 А знаете ли вы, что...
SQL может выполнять рекурсивные запросы для работы с иерархическими данными.


1
122
2

Ответы:

Используйте 2 вложенных запроса и функцию IN():

SELECT a.ID, m.NAMEID, a.DATE, a.TIME, a.INOUT
FROM ABSEN AS a INNER JOIN MASTERID AS m ON a.ID = m.ID
WHERE a.ID NOT IN(select ID from ABSEN WHERE Option = "NO")
AND a.ID IN(SELECT ID FROM ABSEN GROUP BY ID HAVING Count(*)>2)
ORDER BY a.ID, a.DATE, a.INOUT;

На основе пересмотренных выборочных данных:

SELECT a.ID, m.NAMEID, a.DATE, a.TIME, a.INOUT
FROM ABSEN AS a INNER JOIN MASTERID AS m ON a.ID = m.ID
WHERE a.ID NOT IN(select ID from ABSEN WHERE Option = "NO")
AND a.ID & [Date] IN(SELECT ID & [Date] FROM ABSEN GROUP BY ID & [Date] HAVING Count(*)>2)
ORDER BY a.ID, a.DATE, a.INOUT;

Решено

Вы хотите перечислить строки, если ID&DATE встречаются более двух раз (не считая строк с OPTION='N'):

SELECT a.ID, MASTERID.NAMEID, a.DATE, a.TIME, a.INOUT
FROM ABSEN AS a 

     INNER JOIN MASTERID 
     ON a.ID = MASTERID.ID
WHERE (SELECT COUNT(*)
       FROM ABSEN AS a2
       WHERE a.ID = a2.ID 
         and a.DATE = a2.DATE
         and IIF(a2.OPTION IS NULL, '', a2.OPTION) <> 'NO'
       ) > 2
ORDER BY a.ID, a.DATE, a.INOUT;