Announcement

Collapse
No announcement yet.

Hilfe zu komplexer Abfrage

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Hilfe zu komplexer Abfrage

    Hallo kann uns wer uns helfen ? Ich sitz hier mit nem Kollegen einfach schon 8 Stunden an dieser Abfrage und wir kommen einfach zu keinem Ergebnis Gibt es vielleicht irgnendeinen Experten ?

    Ermitteln Sie alle Dozenten, die im Semester WS2008 keine Vorlesung angeboten und
    diejenigen, die im selben Zeitraum mehr als 3 Vorlesungen gehalten haben. Die Ausgabe
    soll DozKN, Name, AnzahlVorlesungen enthalten

    Die Tabellen die wir dazu haben:


    create table Vorlesungsangebot (
    Vnr integer,
    Semester varchar(6),
    DozKn varchar(2),
    Raum varchar(8),
    Zeit varchar(10),
    primary key (Vnr, Semester),
    foreign key (Vnr) references Vorlesung);


    create table Dozent (
    DozKn varchar(2) primary key,
    Name varchar(50) not null,
    FB varchar(20),
    Raum varchar(6),
    Telefon varchar(4));

    Wir kommen hier einfach zu keinem sinnvollen Ergebnis, wir bitten echt um Hilfe da wir nach der ganzen Zeit echt zu keinem Ansatz mehr kommen -.-

    Ein Ansatz ist folgender:

    select do.DozKn, Name, Semester, count(va.DozKn)"Anzahl Vorlesung"
    from Dozent do left join Vorlesungsangebot va
    on do.DozKn = va.DozKn
    group by do.DozKn, Name, Semester;

    Das wäre die Ausgabe:
    DOZKN NAME SEMESTER Anzahl Vorlesung
    ----- -------------------------------------------------- -------- ----------------------
    Ac Achilles WS2006 2
    Gr Großmann 0
    Ac Achilles WS2008 2
    Ze Zeppenfeld 0
    Cl Cleven 0
    Kr Krägeloh WS2007 2
    Ac Achilles SS2008 1

    7 Gewählte Zeilen



    Problem ist das Krägeloh ja auch mit ausgegeben werden muss, dass dieser Professor im WS2008 keine Vorlesung gehalten hat... und das ist das eigentliche Problem
    Zuletzt editiert von MilloZ; 24.01.2011, 19:24.

  • #2
    Hallo,

    in eurer Abfrage fehtl ja auch noch die Einschränckung auf das Semester und auf die Anzahl der Vorlesungen.

    Das Erstere gehört in die Where-Klausel bzw. sogar in die Join-Bedingung und für das Zweitere ist HAVING zuständig.

    Gruß Falk
    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

    Comment


    • #3
      Hallo Falk und zunächst danke für deine Antwort

      Problem ist ja bei dem Semester, dass wir durch die Einschränkung bspw. where Semester ='WS2008' dann nicht mehr diejenigen angezeigt bekommen, die im WS 2008 Vorlesungen gehalten haben

      bspw. so:

      Select DozKn,Name, count(null)
      from Dozent
      where DozKn not in (select Dozkn from Vorlesungsangebot
      where Semester ='WS2008')
      group by DozKn, Name
      union
      (select do.dozkn, name, count(va.dozkn)
      from dozent do left join vorlesungsangebot va
      ON do.dozkn = va.dozkn
      where Semester ='WS2008'
      group by do.dozkn, name);

      Das wäre quasi dann unsere gewünschte Ausgabe die so aussieht:

      DOZKN NAME COUNT(NULL)
      ----- -------------------------------------------------- ----------------------
      Ac Achilles 2
      Cl Cleven 0
      Gr Großmann 0
      Kr Krägeloh 0
      Ze Zeppenfeld 0


      Problem ist, dass es sowas wie count(null) bestimmt nicht gibt das wäre eher mehr getrickst als ernsthaft richtig. Zumindest kann ich es mir nicht vorstellen dass es so richtig sein kann

      Comment


      • #4
        Hier ein möglicher Ansatz (Hatte leider nicht die Zeit, es zu testen):

        Code:
        ((select DozKn, 0 AS Anzahl
           from Dozent)
        MINUS
        ( select do.DozKn, NULL
            from Dozent do join Vorlesungsangebot va on do.DozKn = va.DozKn
            where semester = 'WS2008'
        ))
        UNION
        ( select do.DozKn, count(1)
            from Dozent do join Vorlesungsangebot va on do.DozKn = va.DozKn
            where semester = 'WS2008'
            group by do.DozKn
            having count(1) > 3
        )
        ;
        kuemmelchen

        Comment


        • #5
          Hallo Kuemmelchen und danke für deinen Lösungsansatz! Könntest du mir erklären was count(1) bedeutet? mal als nebenfrage wäre auch "count(null)" erlaubt?

          Dein Ansatz ergibt folgende Ausgabe:

          DOZKN ANZAHL
          ----- ----------------------
          Ac 0
          Cl 0
          Gr 0
          Kr 0
          Ze 0

          Is auch logisch, da es keinen Dozenten gibt der mehr als 3 Vorlesungen gehalten hat.

          Danke schonmal

          Comment


          • #6
            COUNT: zählt die Mitglieder jeder Gruppe

            COUNT selber erwartet als Eingabe eine Spalte, *-Symbol oder ein Literal.

            count(1) bedeutet: Statt den genauen Namen des Mitgliedes der Gruppe zu kennen, wird jedes Mitglied als 1 bezeichnet und diese werden durch COUNT gezählt.
            Statt 1 hätte man auch 'BlaBla' schreiben können.

            COUNT (NULL) ist erlaubt, aber das Ergebnis ist immer 0. Bei Gruppenfunktionen, wozu COUNT zählt, werden NULL-Werte prinzipiell ignoriert.

            kuemmelchen

            Comment


            • #7
              Originally posted by MilloZ View Post
              ...Ermitteln Sie alle Dozenten, die im Semester WS2008 keine Vorlesung angeboten und
              diejenigen, die im selben Zeitraum mehr als 3 Vorlesungen gehalten haben.
              Ich würde das jetzt nicht so interpretieren, als ob das in eine Query müsste aber gut...

              Alle Dozenten und die Anzahl Ihrer Vorlesungen im Semester 'WS2008' bekommt man doch mit:
              [highlight=sql]
              select do.DozKn, do.Name, va.Semester, count(va.DozKn) "Anzahl Vorlesung"
              from Dozent do
              left join Vorlesungsangebot va on do.DozKn = va.DozKn and va.Semester = 'WS2008'
              group by do.DozKn, do.Name, va.Semester
              [/highlight]
              Jetzt müssen doch nur noch die selektiert werden, die KEINE oder mehr als 3 Vorlesungen gehalten haben.
              [highlight=sql]
              select do.DozKn, do.Name, va.Semester, count(va.DozKn) "Anzahl Vorlesung"
              from Dozent do
              left join Vorlesungsangebot va on do.DozKn = va.DozKn and va.Semester = 'WS2008'
              group by do.DozKn, do.Name, va.Semester
              having count(va.DozKn) = 0 or count(va.DozKn) > 3
              [/highlight]
              Oder denke ich zu einfach?

              count(NULL) ist übrigens syntaktisch möglich, liefert jedoch IMMER 0

              Gruß Falk
              Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

              Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

              Comment


              • #8
                Hallo Falk deine Lösung bringt es genau das auf den Punkt! Du denkst keineswegs zu einfach! Du denkst genau richtig! Die Ausgabe erzeugt genau das gewünschte Ergebnis!

                Vielen, vielen Dank an alle die sich mit unserem Problem auseinander gesetzt haben. Bin euch echt dankbar!

                Comment

                Working...
                X