Abfrage - Problem mit Having Bedingung

  • Hallo,

    folgende Aufgabenstellung in SQL (Oracle):
    An welchen Wochentagen wurden die meisten Mitarbeiter geboren?
    Ausgegeben sollen folgende Spalten werden: der Wochentag und die Anzahl der Geburten!

    Den SQL Code haben ich schon, nur fehlt mir die entsprechene Having Bedingung:
    SELECT to_char(M_GEBDAT, 'DAY'), count(to_char(M_GEBDAT, 'DAY')) AS Anzahl
    FROM Mitarbeiter
    group by to_char(M_GEBDAT, 'DAY');

    Die Abfrage gibt mir jetzt die Anzahl der Geburten pro Wochentag aus (alle). Aber ich benötige nur die Zeile mit den meisten Geburten(Anzahl) und den Wochentag.

    mein Vorschlag für die Having Bedinung wäre:
    Having to_char(M_GEBDAT, 'DAY') = max(to_char(M_GEBDAT, 'DAY'))

    Bei mir ist hier leider noch der Knoten drinnen...

    Danke schon mal!

    BG
    Ray

  • Having to_char(M_GEBDAT, 'DAY') = max(to_char(M_GEBDAT, 'DAY'))


    Nein, das geht so nicht. Da muss eine Unterabfrage her, die eine einzelne Spalte ausgibt, die für jeden Wochentag die Anzahl der an diesem Wochentag geborenen Mitarbeiter enthält. Und für jede der in der äußeren Abfarge durch GROUP BY entstehenden Gruppen muss dann, damit diese Gruppe im Ergebnis enthalten ist, die Anzahl größer oder gleich aller in der Unterabfrage selektierten Anzahlen sein:

    Having count(to_char(M_GEBDAT, 'DAY')) >= ALL(...)

  • Ok, danke für die Erklärung.

    Als Having Bedinung hätte ich jetzt dann folgendes genommen:
    Having count(to_char(M_GEBDAT, 'DAY')) >= ALL (SELECT count(to_char(M_GEBDAT,'DAY')) FROM Mitarbeiter);

    funktioniert aber leider nicht (keine Ausgabe). Irgendwo ist noch der Knoten drinnen...

  • funktioniert aber leider nicht (keine Ausgabe). Irgendwo ist noch der Knoten drinnen...

    Ja, das ist offensichtlich. Deine Unterabfrage ermittelt die Gesamtanzahl der Mitarbeiter, nicht die Anzahl der an jedem Wochentag geborenen Mitarbeiter.

  • ok, hab den Fehler gefunden:
    Having count(to_char(M_GEBDAT, 'DAY')) >= ALL (SELECT count(to_char(M_GEBDAT,'DAY')) FROM Mitarbeiter group by to_char(M_GEBDAT,'DAY'));

    So eine Kleinigkeit kostet so viel Zeit...ärgerlich...

    Danke für die Unterstützung!

  • Hallo,
    darf ich dich noch was fragen? Ich brauch wieder einen Denkanstoß!

    Aufgabe:
    Alle Mitarbeiter eines Unternehmens haben einen Test (Benotung: 1-5) durchführen müssen. Gib die Abteilungen mit den entsprechenden Notendurchschnitt aus!

    Hier mein Versuch:
    SELECT DISTINCT(Abteilungen.A_ID) AS Abteilungen, AVG(Tests.T_NOTE) as Durchschnitt
    FROM Mitarbeiter left join Tests
    ON M_NR = Testkandidat_nr,
    Mitarbeiter m right join Abteilungen a
    on m.M_Abteilung = a.A_ID, Abteilungen
    Group by Abteilungen.A_ID
    Having AVG(Tests.T_NOTE) = (SELECT AVG(Tests.T_NOTE) FROM Mitarbeiter left join Tests
    ON M_NR = Testkandidat_nr group by Mitarbeiter.M_Abteilung);

    Ohne der Having Bedingung, bekomme ich bei den 3 Abteilungen den selben Durchschnittswert angezeigt.

    Danke

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!