aGGroLadY Geschrieben 30. Januar 2010 Teilen Geschrieben 30. Januar 2010 Hallo Leute, ich hab ein paar Abfragen für eine MitarbeiterDB bei denen ich einfach auf keinen grünen Zweig komme. Vielleicht könnt ihr mir ja weiterhelfen. Wäre echt super, mache heute seit 12 Stunden nix anderes wie DB-Abfragen und hab langsam echt ein Brett vor dem Kopf ;-) Erst mal die DB: mitarbeiter mid INTEGER NOT NULL mname VARCHAR(20) NOT NULL chef INTEGER => REFERENCES mitarbeiter (mid) abteilung aid INTEGER NOT NULL mname VARCHAR(20) NOT NULL leitet mid INTEGER NOT NULL => REFERENCES mitarbeiter (mid) aid INTEGER NOT NULL => REFERENCES abteilung (aid) von DATE NOT NULL bis DATE Hier die Abfragen: 1. Welche Personen haben genau einen Untergebenen? Da komm ich irgendwie gar nicht drauf, hab mit da ewig verzettelt mit einem COUNT an der falschen stelle und vorbei war es. 2. Erstellen Sie eine vollständige Übersichttabelle, die Informationen zu allen Mitarbeitern enthält: id, name, name und mid des Chefs (wenn vorhanden) sowie name und aid der Abteilung, die der Mitarbeiter DERZEIT evtl. leitet. Mein Ansatz: SELECT mitarbeiter.mid, mitarbeiter.mname, mitarbeiter.chef, abteilung.aid, abteilung.aname AS uebersicht FROM mitarbeiter, leitet, abteilung WHERE leitet.bis IS NULL AND; Weiter komm ich aber nicht, ich hab es auch mal mit Views versucht, aber da kam auch irgendwie nix passendes raus. 3. Geben Sie für jede Abteilung an, wie viele Leiter es dort zurzeit gibt. Geben Sie auch diejenigen Abteilungen aus, deren Leiterposten derzeit vakant ist. Ich kann die Abteilungen mit der Anzahl ausgeben: SELECT abteilung.aname, COUNT(mitarbeiter.mname) FROM mitarbeiter, leitet, abteilung WHERE leitet.bis IS NULL AND mitarbeiter.mid=leitet.mid AND leitet.aid=abteilung.aid GROUP BY abteilung.aname Und die Abteilungen die ohne Leiter sind: SELECT abteilung.aname FROM abteilung WHERE abteilung.aid NOT IN (SELECT abteilung.aid FROM abteilung, leitet WHERE abteilung.aid = leitet.aid ) Aber wie ich das kombinieren kann weiß ich nicht. 4. Gibt es in unserer Datenbank Abteilungen, die von vier oder mehr Leitern im Laufe der Zeit geleitet wurden? (Mich interessiert nicht, welche Abteilungen das im Einzelnen sind!) Ihre Lösung soll eine Tabelle mit genau einer Spalte und einer Zeile ausgeben, die je nach Antwort trueo der false enthält. Überhaupt keine Ahnung ... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
_n4p_ Geschrieben 31. Januar 2010 Teilen Geschrieben 31. Januar 2010 1) SELECT * FROM mitarbeiter WHERE mid IN (SELECT chef FROM mitarbeiter GROUP BY chef HAVING COUNT(chef) = 1) 2) SELECT ma.mid,ma.mname.chef.mid,chef.mname,abteilung.aname FROM mitarbeiter AS ma LEFT JOIN mitarbeiter AS chef ON (ma.chef = chef.mid) LEFT JOIN leitet ON (ma.mid = leitet.mid AND leitet.von < NOW() AND (leitet.bis > NOW() OR leitet.bis IS NULL)) LEFT JOIN abteilung ON (leitet.aid = abteilung.aid) für NOW() eine funktion einsetzen die das aktuelle datum liefert 3) SELECT abteilung.aid,abteilung.aname,COUNT(leitet.mid) FROM abteilung LEFT JOIN leitet ON (abteilung.aid = leitet.aid) GROUP BY abteilung.aid,abteilung.aname,leitet.mid sollte für abteilungen ohne leiter einfach eine 0 für count() liefern 4) SELECT CASE WHEN MAX(COUNT(mid)) > 3 THEN 'true' ELSE 'false' END AS antwort FROM leitet GROUP BY aid,mid denke ich Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
aGGroLadY Geschrieben 31. Januar 2010 Autor Teilen Geschrieben 31. Januar 2010 (bearbeitet) Super DANKE! Das Licht am Ende des Tunnels! Die ersten beiden funktionieren. Die 3 hab ich noch so verändert das er bei den Abteilungen die im Moment nicht besetzt sind auf 0 schaltet, das es Sortiert wird und hab das leitet.mid bei GROUP BY entfernt sonst zählt er nicht zusammen. SELECT abteilung.aname, COUNT(DISTINCT leitet.mid) FROM abteilung LEFT JOIN leitet ON (abteilung.aid = leitet.aid AND leitet.von < NOW() AND (leitet.bis > NOW() OR leitet.bis IS NULL)) GROUP BY abteilung.aname Bei der letzten Aufgabe meckert er weil man Aggregatsfunktionen nicht verschachteln darf MAX(COUNT(mid)) Ich wollte das so lösen, aber er bringt mir einen Syntaxfehler den ich nicht finden kann: SELECT CASE WHEN (SELECT COUNT(DISTINCT mitarbeiter.mname) FROM mitarbeiter. leitet, abteilung WHERE mitarbeiter.mid=leitet.mid AND leitet.aid=abteilung.aid) > 3 THEN TRUE ELSE FALSE END AS vier_oder_mehr_Leiter Bearbeitet 31. Januar 2010 von aGGroLadY Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
aGGroLadY Geschrieben 31. Januar 2010 Autor Teilen Geschrieben 31. Januar 2010 (bearbeitet) Mist wollte eigentlich keinen Doppelpost machen. Hab jetzt auch die letzte Aufgabe lösen können, vielleicht interessiert es dich ja wie der Code sein muss:(war ja eigentlich Richtig bis auf das MAX und bei der Gruppierung) SELECT CASE WHEN COUNT(mid) > 3 THEN 'true' ELSE 'false' END AS vier_oder_mehr_Leiter FROM leitet DANKE nochmal! Du hast mir sehr geholfen. Bearbeitet 31. Januar 2010 von aGGroLadY Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
_n4p_ Geschrieben 31. Januar 2010 Teilen Geschrieben 31. Januar 2010 gerne, auch wenns nich alles richtig war ^^ aber ich glaub die letzte is noch falsch bei dir, du zählst ja lediglich alle mid in leitet. wie wäre es denn so rum, ich hab leider kein MSSQL da ums zu testen ^^ SELECT CASE WHEN Max((SELECT Count(mid) FROM leitet GROUP BY aid)) > 3 THEN 'true' ELSE 'false' END AS mindestens_4; Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.