Problem mit Tabelle
Jost
- datenbank
1 Bobby0 Bademeister
Hallo ich versuche eine sql-Abfrage für eine Prüfung zu erstellen...
der Datensatz zu dem ich mich hingearbeitet habe sieht folgendermaßen aus:
pid,name,versuche,pruefungID,Mod_modulID,datum,note
20000,'Sam K',1,1,'Mathe2','2009-07-10 00:00:00.000',1.000000
20001,'Tim S',2,1,'Mathe2','2009-07-10 00:00:00.000',5.000000
20001,'Tim S',2,3,'Mathe2','2009-09-12 00:00:00.000',1.000000
20003,'Thorsten G',2,1,'Mathe2','2009-07-10 00:00:00.000',5.000000
20003,'Thorsten G',2,3,'Mathe2','2009-09-12 00:00:00.000',3.700000
20003,'Thorsten G',2,11,'Mathe2','2009-08-25 07:55:37.000',
20004,'Adam Student',1,1,'Mathe2','2009-07-10 00:00:00.000',2.000000
20004,'Adam Student',1,3,'Mathe2','2009-09-12 00:00:00.000',4.000000
20005,'Adam Student',1,1,'Mathe2','2009-07-10 00:00:00.000',5.000000
Ich habe nun das Problem das ich für die ich nur die Studenten angezeigt bekommen möchte die diese Prüfung noch nicht bestanden haben(note besser als 5). Ich kriege es leider nur hin indem ich nach note=5 abfrage. Leider tauchen dann Studenten auf die zwar eine 5 geschrieben haben, aber im 2.Versuch dann eine bessere Note z.B. 3,7 erreicht haben. Somit sollte dieser Datensatz entfallen mir fällt nur keine Möglichkeit ein es so hinzukriegen.
Die sql-abfrage sieht bis jetzt so aus:
select a.pid, a.name, a.versuche, pr.pruefungID, pr.Mod_modulID, pr.datum, min(n.note) as note
from Pruefung as pr
join Note as n
on pr.pruefungID = n.pruefungID
join Ansicht as a
on a.pid = n.pid
where pr.Mod_modulID ='Mathe2'
//and n.note=5
group by a.pid, a.name, a.versuche,pr.pruefungID,pr.Mod_modulID,pr.datum
Hoffe aud eure Hilfe vielen Dank im Vorraus
Moin
Ein Sub-Select in Verbindung mit NOT EXISTS sollte dir helfen.
In der Art:
select from tabelle1 a WHERE note=5 AND NOT EXISTS (SELECT from tabelle1 b WHERE b.note<5 AND b.name=a.name)
So in der Art.
Gruß Bobby
Hi Jost.
Ich habe nun das Problem das ich für die ich nur die Studenten angezeigt bekommen möchte die diese Prüfung noch nicht bestanden haben(note besser als 5). Ich kriege es leider nur hin indem ich nach note=5 abfrage. Leider tauchen dann Studenten auf die zwar eine 5 geschrieben haben, aber im 2.Versuch dann eine bessere Note z.B. 3,7 erreicht haben.
Du brauchst fuer Deine Ergebnismenge Informationen aller Datensaetze fuer die entsprechende Pruefung, willst aber nur eine Liste der Studenten (die jeweils ggf. mehrere Datensaetze haben). Also solltest Du die Datensaetze nach den Studenten, sprich, der Spalte 'name' gruppieren. Die Eigenschaft, die einen Studenten fuer das Auftauchen in Deiner Ergebnismenge qualifiziert, ist dann:
"Alle Noten des Studenten sind mindestens(?) 5.", bzw. etwas SQL-naeher:
"Das Minimum aller Noten des Studenten ist mindestens 5."
Die SQL-Uebersetzung davon bildet dann Deine HAVING-Klausel.
Und noch zwei Fragen aus Interesse zu Deinem Datenbank-Design:
1.: In einer Zeile steht eine Anzahl von Versuchen fuer die Pruefung (mitunter > 1) und auch ein Datum und eine Note. Hat das irgendeinen Sinn?
2.: Was sind pid und pruefungID? Wie eine Pruefung in Deiner Datenbank charaktrisiert ist, vertehe ich bisher nicht im geringsten.
Viele Gruesse,
der Bademeister