SQL Simple DML anfragen

sqler134

Neuer Benutzer
Beiträge
2
Hey, ich weiß nicht genau in welche Kategorien ich die Fragen stellen soll, deswegen hier.
Also ich hab eine Tabelle Professoren mit Spalten (PerNr, Name, Rang, Gehalt) wobei PersNr der Primärschlüssel ist.
Nun hab ich einmal die Anforderung :
Finden Sie die Professoren (Name), die pro Rang das geringste Gehalt bekommen.
Ich habe dies so gelöst :
SQL:
SELECT tmp.name
FROM  (SELECT p.name , min(gehalt) FROM Professor p GROUP BY p.name ) tmp
Dann diese Anforderung :
Finden Sie den Rang, in dem mindestens ein Professor ein genau so hohes Gehalt bekommt, wie das Durchschnittsgehalt für diesen Rang ist.
Hier hat mich dieses 'den' irritiert .
Ich hab dies so gelöst :
SQL:
SELECT p.name
FROM Professoren p JOIN (SELECT rang, avg(Gehalt) As DurchGehalt
                         FROM professoren
                         GROUP BY rang ) tmp  ON p.rang = tmp.rang AND p.gehalt = tmp.DurchGehalt
Bitte steinigt mich nicht bei fatalen Fehlern , bin blutiger Anfänger . Danke.
Gruß
 
Werbung:
Hier meine Tabelle:
Code:
select * from profs;
dbforum.png
Einerseits ist die erste Abfrage mit einem einfacherer Abfrage lösbar:
Code:
select min(gehalt) from profs group by rang

zweiteres habe ich in PostgreSQL gelöst nach grübeln ;)
Code:
with recursive proffs(name, rang, gehalt) as (select name, rang, avg(gehalt) from profs group by name, rang)
select proffs.name, proffs.rang, proffs.gehalt from proffs, profs where proffs.gehalt = profs.gehalt
group by proffs.gehalt, proffs.name, proffs.rang

Resultat:

dbforum2.png
 
Einerseits ist die erste Abfrage mit einem einfacherer Abfrage lösbar
Das zeigt sehr schön die Group Funktion, die auch etwas gruppieren kann (und es wirklich tut), selbst wenn es nicht ausgegeben wird.
select min(gehalt) from profs group by rang
Aber sie erfüllt nicht die Anforderung.

Ich würde es z.B. so machen:
Code:
select pf.name, 
           -- pf.rang, 
           --- pf.gehalt 
from 
(select p.rang , min(p.gehalt) mingehalt 
  from Professor p 
 group by p.rang) mn join professor pf
on (mn.rang, mn.mingehalt) = (pf.rang, pf.gehalt)

Finden Sie den Rang, in dem mindestens ..
Hier hat mich dieses 'den' irritiert .
Das ist tatsächlich eine schräge Formulierung. Wie sie auszulegen ist, könnte man mglw. an den vorgegebenen Daten ablesen (raten).
Aber das geht hier nicht, da wir das nicht sehen.
Deine Abfrage ist richtig, mglw. kommen je nach Daten nur ein Ergebnis, eben "der Rang" oder mehrere, bei denen das zutrifft.

zweiteres ..nach grübeln
Das ist nicht richtig. Wenn Du Deine Profs gemäß ID umbenennst, wirst Du das feststellen.

Und das führt dann dazu, dass es in allen Lösungen Probleme gibt, wenn man nicht zwischen Primärschlüssel und einem scheinbar eindeutigen Merkmal wie Name unterscheidet.
 
Werbung:
Zurück
Oben