Zum Inhalt springen

Probleme mit Abfragen


aGGroLadY

Empfohlene Beiträge

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 ...

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von aGGroLadY
Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von aGGroLadY
Link zu diesem Kommentar
Auf anderen Seiten teilen

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;


Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...