Ankündigung

Einklappen
Keine Ankündigung bisher.

Reihenfolge nicht beachten?

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Reihenfolge nicht beachten?

    Guten Abend,

    im Rahmen einer Hausaufgabe müssen wir mit PLPGSQL eine Funktion schreiben, die folgendes erledigen soll:

    "Schreiben Sie eine Funktion occupancy die berechnet , wer mit wem wie viel Mal in einem Doppelzimmer übernachtet hat. Beachten Sie dabei, dass die Mitglieder in unterschiedlicher Reihenfolge genannt werden können, d.h. Müller als mitglied1 und Schulze als mitglied2 ist dasselbe wie Schulze als mitglied1 und Müller als mitglied2. Die Kombinationen können mit race notice auf dem Bildschirm ausgegeben werden. Beachten Sie dabei, dass jede Kombination nur 1 Mal ausgegeben wird."

    Hier sind auch die folgenden Tabellenscripte (ohne Datensätze):

    Code:
    create table reisen (
    
      rid int primary key,
      ziel varchar(20),
      hotel varchar(20),
      von date,
      bis date);
    
    create table mitglieder (
    
      mID int,
      name VARCHAR (50),
      gebDatum date,
      primary key (mID));
    
    create table istImDoppelzimmer (
       mitglied1 int references Mitglieder,
       mitglied2 int references Mitglieder,
       reise int references Reisen,
       primary key (mitglied1,mitglied2,reise));
    Mein erster Ansatz bestand darin, dass ich die oben fett gedruckte Bedingung ebenfalls versuche, mit SQL abzuhandeln. Das ist leider fürchterlich in die Hose gegangen. Mein momentaner SQL Query berechnet zwar, wer wie oft mit anderen Mitgliedern in einem Zimmer übernachtet hat, allerdings ohne die Erfüllung der oben genannten Bedingung, dass jede Kombination nur einmal ausgegeben wird.

    Das ist mein derzeitiger SQL-Query:

    SELECT DISTINCT(COUNT(*)) AS Anzahl, m1.mid, m1.name, m2.mid, m2.name
    FROM mitglieder m1, mitglieder m2, istImDoppelZimmer z
    WHERE (z.mitglied1 = m1.mid AND z.mitglied2 = m2.mid) OR (z.mitglied1 = m2.mid AND z.mitglied2 = m1.mid)
    GROUP BY m1.mid, m1.name, m2.mid, m2.name
    Mein zweiter Ansatz bestand darin, dass ich die SQL-Abfrage so übernehme und in einer Stored Procedure nach der fett gedruckten Bedingung filter. Das Resultat ist, dass ich keinen Ansatz hätte, wie ich das in PLPGSQL formulieren könnte. Arrays scheinen auch nicht wirklich sinnvoll unterstützt zu sein.

    Daher meine Frage: Ist es überhaupt möglich, die SQL-Abfrage zu modifizieren, sodass die fett gedruckte Bedingung erfüllt wird?

  • #2
    Zitat von Anyone Beitrag anzeigen
    Daher meine Frage: Ist es überhaupt möglich, die SQL-Abfrage zu modifizieren, sodass die fett gedruckte Bedingung erfüllt wird?
    Natürlich. Um mal zu zeigen, wie das geht, folgender Code:

    Code:
    test=*# select * from wer_mit_wem ;
     id1 | id2
    -----+-----
       1 |   2
       1 |   3
       2 |   3
       3 |   5
       4 |   6
       2 |   1
       3 |   2
    (7 rows)
    
    Time: 0,141 ms
    test=*# select distinct greatest(id1,id2), least(id1,id2) from wer_mit_wem ;
     greatest | least
    ----------+-------
            3 |     1
            5 |     3
            2 |     1
            6 |     4
            3 |     2
    (5 rows)

    Kommentar


    • #3
      Dankeschön für die Antwort. Wie kommt man dann noch zusätzlich an die Anzahl der Übernachtungen? Also ich habe es anders gelöst, allerdings würde mich schon noch interessieren, wie man zusätzlich noch die Anzahl mit SQL ermitteln könnte.

      Kommentar


      • #4
        Zitat von Anyone Beitrag anzeigen
        Dankeschön für die Antwort. Wie kommt man dann noch zusätzlich an die Anzahl der Übernachtungen? Also ich habe es anders gelöst, allerdings würde mich schon noch interessieren, wie man zusätzlich noch die Anzahl mit SQL ermitteln könnte.
        select count(*), mal so als Stichwort. Oder was genau meinst Du?


        Andreas

        Kommentar

        Lädt...
        X