Here's one way that works. It might not be the most sophisticated way to do this - but it works.
I believe it may be possible to do this using a 'Not Exists' in the Where Clause - using a dupe table with an alias name . . .
1. Create a query named 'QryStudents_With_B_Offense' that returns all Students who have a B Offense:
Code:
SELECT DISTINCT Offense.StudentID
FROM Offense
GROUP BY Offense.StudentID, Offense.ViolationDate, Offense.Offense
HAVING (((Offense.Offense)="B"));
2. Create a second query like this:
Code:
SELECT DISTINCT Offense.StudentID
FROM Offense LEFT JOIN QryStudents_With_B_Offense ON Offense.[StudentID] = QryStudents_With_B_Offense.[StudentID]
WHERE (((QryStudents_With_B_Offense.StudentID) Is Null));
When you run the second query - you should get all the students who have ONLY an A offense against their names.
I used 'Distinct' in both queries so that you only get each student name once.
Let me know if this helps.