Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Probleme mit Abfragen

Empfohlene Antworten

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

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

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

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

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;


Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.