Ich verwalte eine Student-Datenbank. Jedes Semester registrieren wir Studenten für ihre Klassen, und dieser Fortschritt wird in einer Tabelle, [Registration Status Record]
verfolgt. Jede Zeile in der Tabelle besteht im Wesentlichen aus: [Student ID]
, [Semester]
, [Registration Status]
und [Notification Status]
.Erstellen Sie Iif() - Anweisung oder Abfrage, um mehrere Werte in mehreren Zeilen zu überprüfen, die auf ID
Beispieldaten:
[Semester]
(Semester, in dem der Schüler registriert ist)- Herbst 2016, Frühjahr 2017
Registration Status
(Ob die Anmeldung des Studenten abgeschlossen ist)- Vollständig, benötigt, Err oder
[Notification Status]
(Sobald die Registrierung abgeschlossen ist, ob der Student mitgeteilt wurde)- benachrichtigen, Schwebende
Was Ich mag würde, ist eine andere Abfrage oder Iif zu erstellen () Anweisung, die überprüft alle Zeilen für einen bestimmten Schüler und ihre insgesamt Registrierungsstatus unabhängig vom Semester zurückgeben.
Wenn eine IIF() Anweisung, hier einige der Kriterien würde ich gesucht werden:
- Wenn ein Student für alle Semester erfolgreich registriert ist, und sie haben in Bezug auf jedes Semesters mitgeteilt worden, wäre es melden Sie etwas wie "Alle Anmeldungen abgeschlossen, Student vollständig benachrichtigt".
- Wenn ein Student vollständig registriert, aber nur für ein Semester benachrichtigt wird, "Alle Registrierungen abgeschlossen, Benachrichtigung unvollständig."
- Und so weiter ... Ich denke, Sie bekommen die Idee.
Soweit eine Iif() Aussage, habe ich keine Ahnung, wo ich anfangen soll. Und was das Erstellen von Abfragen angeht, bin ich genauso ratlos. Ich dachte, ich würde mindestens eins für Studenten machen, die zu 100% fertig sind. Unten ist mein schwacher Versuch, basierend auf einer anderen Antwort, die ich gefunden habe (https://dba.stackexchange.com/questions/1775/matching-single-column-against-multiple-values-without-self-joining-table-in-mys). Die Idee ist, dass diese Abfrage alle vollständig abgeschlossen Studenten zeigen sollte (100% für alle Semester registriert und gemeldet):
SELECT [Registration Status Record].[Student ID], Count([Registration Status Record].[Registration Status]) AS [CountOfRegistration Status]
FROM [Registration Status Record]
WHERE ((([Registration Status Record].[Registration Status])="Complete") AND (([Registration Status Record].[Notification Status])="Notified"))
GROUP BY [Registration Status Record].[Student ID]
HAVING (((Count([Registration Status Record].[Registration Status]))>0));
Meine Erwartung ist, dass, wenn zum Beispiel ein Schüler hat nur Registrierung für das Frühjahr 2017 und es ist zu 100% fertig, es wird ihnen zeigen. Wenn sie es stattdessen sowohl für den Herbst 2016 als auch für das Frühjahr 2017 haben und es zu 100% fertig ist, wird es ihnen auch zeigen. Aber wenn sie für beide Semester angemeldet sind und es für beide nicht vollständig ist, wird es ihnen nicht zeigen. Aber es tut! Einer der Schüler, den er zurückgibt, ist zum Beispiel 100% für den Herbst 2016, aber nur teilweise für den Frühling 2017 (seine Registrierung ist abgeschlossen, aber sie wurden nicht benachrichtigt).
Ich weiß, dass es einen Weg geben muss, dies zu tun.Ich kann artikulieren, was ich will in Englisch oder Spanisch, aber nicht SQL. Jede Hilfe wird geschätzt ... und Entschuldigungen für die unzusammenhängende Natur dieser Frage.
Da Sie verwendet 'Count', haben Sie ein Aggregat Abfrage erstellt. Da Ihr einziges "GROUP BY" -Feld "StudentID" ist, erhalten Sie einen Datensatz für jeden Studenten, der einen Datensatz hat, bei dem der Status "abgeschlossen" ist und die Benachrichtigung "benachrichtigt" ist. Versuchen Sie, das Zählfeld und die 'HAVING'-Klausel zu entfernen, um zu sehen, ob Ihnen die benötigten Rohdaten zur Verfügung stehen. Wenn Sie die Anzahl benötigen, erstellen Sie eine weitere Abfrage basierend auf dieser, die den Registrierungsstatus zählt. Veröffentlichen Sie einen Kommentar zu Ihren Ergebnissen, ich kann versuchen, zu helfen, wenn ich nach Hause komme. – MoondogsMaDawg
Vielen Dank für Ihre Antwort. Ich habe versucht, das Feld "Anzahl" zu entfernen, obwohl es sich ähnlich zu verhalten scheint. Zum Beispiel kam ein Student, der für Frühling registriert ist, aber "Fehler" für den Herbst hat. Hier ist, was die überarbeitete Abfrage liest: 'SELECT [Registration Status Record]. [Studenten ID] FROM [Registration Status Record] WHERE (([Registration Status Record]. [Registrierung Status]) =" abgeschlossen ") AND (([Registration Status Record]. [Benachrichtigungsstatus]) = "Notified")) GROUP BY [Registrierungsstatussatz]. [Studenten ID]; ' Ich muss jetzt zum Abend gehen, aber ich werde noch einmal nachsehen das morgen. –
Christopher, wie Sie sehen können Parfait Lösung unten für meine Bedürfnisse funktioniert. Trotzdem, nochmals vielen Dank für Ihre Hilfe! –