Я пытаюсь выбрать запрос из числа строк более 2 на основе идентификатора, ДАТЫ и ОПЦИИ в MS Access.
поэтому, если в столбце параметров указано «НЕТ», запись более 2 не включена в мой код запроса sql.
Что-то не так с моим SQL-кодом?
поэтому мой пост отличается от ссылки ниже
Пожалуйста, направь меня
Стол Absen
Стол MASTERID
Я использовал этот результат кода 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;
Результат из кода
Желаемый результат
Таблица Absen
для тестового ответа от @june7
Результат ответа @june7
Таблица Absen
для обновления ответов на тестирование от @june7 28-08-2024.
Стол MASTERID
с обновлением кода ответа
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;
Результат публикации старого кода
🤔 А знаете ли вы, что...
SQL может выполнять рекурсивные запросы для работы с иерархическими данными.
Используйте 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;