Announcement

Collapse
No announcement yet.

Angabe von Paaren

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

  • Angabe von Paaren

    Hallo, ich habe folgende Tabellen:

    • Mitarbeiter (#PNr, Name, *ANr, Gehalt)
    • Abteilung (#ANr, AName)
    • Hotel (#HNr, HName, HKategorie, PLZ, Ort)
    • Reise (#*Mitarbeiter, #*Hotel, #Beginndatum, Dauer, Kosten)
    (#=Primärschlüssel, *=Fremdschlüssel)

    So und nun habe ich ein kleines Problem. Ich möchte gerne alle Paare von Mitarbeiter anzeigen lassen die im selben Hotel mit gleichem Beginndatum übernachtet haben.

    Das Problem ist, das ich nicht genau verstehe wie ich a:
    2 Mitarbeiter als Paar darstellen soll, und b wie ich das Beginndatum auf gleichheit überprüfe.

    Ich hatte erst etwas probiert mit:
    where Beginndatum = Beginndatum, das hier das falsche herauskommt ist ja einleuchtend.

    Muss ich hier einen subselect anlegen das ich bei zwei unterschiedlichen selects das Beginndatum vergleiche?

  • #2
    Mhhh mal sehen:

    [highlight=sql]
    select Reise.Beginndatum, Hotel.HName, count (Mitarbeiter.PNR)
    FROM Reise
    JOIN Hotel
    ON Reise.Hotel = Hotel.HNr
    JOIN Mitarbeiter
    ON Reise.MitarbeiterPnr = Mitarbeiter.Pnr
    GROUP BY Reise.Beginndatum, Hotel.HName
    having count(*) > 1
    [/highlight]

    Bin neu in MySql hoffe mal das "having count" hier auch geht.
    somit hast du alle Reisen mit mehr als einem Mitarbeiter.

    Anschließend kannst du dir geziehlt die Mitarbeiter zu den Reisen ausgeben lassen.

    Wenn du das Aggregat mit Count weglässt kannst du dir auch gleich den Mitarbeiter ausgeben lassen, dann hättest du die für Reisen jeweils so viele Einträge wie Mitarbeiter existieren. Diese Musst du dann Applikationsseitig ausgeben.

    Mitarbeiter in Unterschiedlichen Spalten ausgeben wird Umständlicher, da es ja theoretisch 100 MItarbeiter sein können die an einer Reise Teilnehmen können. Hierfür würde ich eine Prozedur empfehlen. Aber auch die Anzeige wird dann aufwendiger. Du muss im Frontend dann unbestimmt viele Spalten auslesen was komplizierter ist als die Zeilen abzuarbeiten.

    Wenn du lediglich die Namen willst könntest du die Mitarbeiter auch Kommasepariert aneinanderhängen und in einem Feld ausgeben, dann kannst du diese Zwar anzeigen, wirst aber Probleme haben diese danach weiter im SQL zu verwenden.

    Hoffe das hilft dir weiter.

    Wenn du maximal 2 oder 3 Mitarbeiter hast die an einer Reise teilnehmen, dann wäre eine Spaltenweise ausgabe realisierbar, aber das wäre mir Persönlich zu unflexibel und würde Probleme aufwerfen, wenn doch Mehr Mitarbeiter teilnehmen.

    Comment


    • #3
      Nachtrag:

      Wenn du einfluss auf die Tabellenstruktur nehmen Kannst,

      Könntest du die das ganze evtl. so optimieren:
      Reise
      id,hotel,startdatum

      Mitarbeiter
      id, Name

      MitarbeiterZuReise
      idMitarbeiter, idReise

      dadurch hast du jede Reise nur einmal in der Datenbank (muss beim anlegen neuer Reisen geprüft werden!). Im Sinne der Normalisierung evtl. Sinnvoll, Das grundsätzliche "Zeilen in Spalten"-Problem löst dies aber leider nicht.

      Comment


      • #4
        Hi und danke erstmal für deinen Post.
        Die Ausgabe sollte in dieser Form erfolgen:

        2010-03-03 Hotel A Mitarbeiter A Mitarbeiter NR
        2010-03-03 Hotel A Mitarbeiter b Mitarbeiter NR

        2010-04-03 Hotel C Mitarbeiter x Mitarbeiter NR
        2010-04-03 Hotel C Mitarbeiter y Mitarbeiter NR

        also das die Paare untereinander stehen.

        Ich hatte erst so eine Idee das ich erst mir alle Mitarbeiter die im Selben Hotel übernachtet haben ausgeben lasse und danach die Gruppierung mittels Having weiter einschränke wo das Beginndatum gleich ist.

        Nur ich hänge schon an der Abfrage welche Mitarbeiter im Selben Hotel übernachtet haben.

        Da ich hier ja auf gleichheit in der selben Spalte prüfen muss.

        Comment


        • #5
          Die Darstellung musst du über frontend lösen.
          Theoretisch kannst du zwar eine leerzeile dazwischen bauen wenn du die Daten mit einer Prozedur abfragst,aber wirklich sinnvoll scheint mir das nicht...

          Comment


          • #6
            Hallo,
            Originally posted by Vertax View Post
            Ich hatte erst so eine Idee das ich erst mir alle Mitarbeiter die im Selben Hotel übernachtet haben ausgeben lasse und danach die Gruppierung mittels Having weiter einschränke wo das Beginndatum gleich ist.

            Nur ich hänge schon an der Abfrage welche Mitarbeiter im Selben Hotel übernachtet haben.
            Der Ansatz ist nicht schlecht, lässt sich aber in SQL schwer umsetzen. Einfacher wäre es doch die Hotels zu ermitteln, in denen mit gleichem Begindatum mehr als ein Mitarbeiter übernachtet hat. Anschließend kann man dann noch die Daten der Mitarbeiter hinzujoinen oder das Ergebnis als Filterkriterium verwenden.
            Hotels mit mehr als einer Übernachtung bekommst du so:
            [highlight=sql]
            select Beginndatum, Hotel
            from Reise
            group by Beginndatum, Hotel
            having count(Mitarbeiter) > 1
            [/highlight]
            Die Mitarbeiter mit Hotelübernachtungen sind ein einfacher Join:
            [highlight=sql]
            select r.Beginndatum, h.HName, m.Name, m.PNr
            from Mitarbeiter m
            inner join Reise r on r.Mitarbeiter = m.PNr
            inner join Hotel h on h.HNr = r.Hotel
            [/highlight]
            Diese beiden Abfragen müssen nun in einem gemeinsamen Select kombiniert werden, indem z.B. die Zweite mit dem Ergebnis der Ersten gefiltert und passend sortiert wird:
            [highlight=sql]
            select r.Beginndatum, h.HName, m.Name, m.PNr
            from Mitarbeiter m
            inner join Reise r on r.Mitarbeiter = m.PNr
            inner join Hotel h on h.HNr = r.Hotel
            where (r.Beginndatum, r.Hotel) in (
            select Beginndatum, Hotel
            from Reise
            group by Beginndatum, Hotel
            having count(Mitarbeiter) > 1
            )
            order by r.Beginndatum, h.HName, m.Name
            [/highlight]

            Eigentlich nicht schwer, oder

            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


            • #7
              Danke schön Falk, das hat weiter geholfen.

              Comment

              Working...
              X