Hallo Community - bin neu hier und auch noch ein SQL Newbie
Ich habe folgendes Problem. Ich will über eine Anfrage eine weitere Anfrage anwenden und dann daraus den “Professor” mit den meisten Prüfungen ausgeben.
Die folgende Anfrage:
select p.Name, count(pr.vorlnr) as Anzahl
from professoren p, pruefen pr
where p.persnr=pr.persnr
group by p.name
order by Anzahl desc
gibt folgendes aus:
Name Anzahl
Kant 3
Sokrates 2
Russell 2
jetzt habe ich mir überlegt, dass ich über die erste select Anfrage eine weitere “stülpe” in der Art, dass
select tmp.Name, tmp.Anzahl
from (select p.Name, count(pr.vorlnr) as Anzahl
from professoren p, pruefen pr
where p.persnr=pr.persnr
group by p.name
order by Anzahl desc)tmp
where tmp.anzahl=MAX(tmp.anzahl)
group by tmp.name
Leider funktioniert das nicht, vielleicht kann mir jmd helfen! Verstehe das mit der MAX Funktion noch nicht so richtig bzw. weiß gerade nicht wo ich die Unteranfrage platzieren muss.
select p.Name, count(pr.vorlnr) as Anzahl
from professoren p, pruefen pr
where p.persnr=pr.persnr
group by p.name
order by count(pr.vorlnr) desc limit 1
und das klappt auch wunderbar.
Hätte man das auch über die MAX Aggreagatfunktion irgendwo lösen können?
Habs noch nciht ganz verstanden
Bei folgender Anfrage kommt
select max(tmp.Anzahl) ,
from (select p.name, count(pr.vorlnr) as Anzahl
from professoren p, pruefen pr
where p.persnr=pr.persnr
group by p.name) tmp
die maximale Anzahl von Prüfungen raus.
Jedoch wenn ich nun versuche den name noch dazu zu bekommen, verändert sich das Anfrage Ergebnis zum “Negativen” (aus meiner Sicht)
select max(tmp.Anzahl) , > tmp.name
from (select p.name, count(pr.vorlnr) as Anzahl
from professoren p, pruefen pr
where p.persnr=pr.persnr
group by p.name)tmp
group by tmp.name
kommt wieder zu jeder Anzahl der Prüfungen der Püfer (Name) und nicht nur der Prüfer zu den Pürufungen mit dem Maximalen Wert!
Jetzt könnte ich ja wieder sagen order by Anzahl desc limit 1 und dann ist es wieder so wie ich es gewollte habe, aber dann könnte ich mir ja uach die geschachtelte Anfrage sparen. Ich blick gerade nicht mehr durch. Vielleicht kannst du noch ein Tipp raushauen
test=*# select * from max;
name
--------
foo
bar
bar
foobar
foo
foo
(6 rows)
test=*# select name, count(1) as anzahl from max group by name order by 2 desc limit 1;
name | anzahl
------+--------
foo | 3
(1 row)
test=*# select name, anzahl from (select name, count(1) as anzahl from max group by name) foo where anzahl = (select max(anzahl) from (select name, count(1) as anzahl from max group by name) bar);
name | anzahl
------+--------
foo | 3
(1 row)
geht dann zwar ohne das LIMIT, aber schön ist wohl was anderes.