Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Wenn / Dann / Sonst in Abfrage nutzen

Dieses Thema im Forum "Oracle" wurde erstellt von FrenchSpirit, 6 August 2018.

  1. FrenchSpirit

    FrenchSpirit Aktiver Benutzer

    Hallo, liebe Experten,

    ich benötige eure Hilfe bei der Filterung von Datensätzen.

    ----
    Select PE.PERSONEN_NR
    , OZA.ANS_ROLLE
    , AA.ADR_ART
    , AA.ADR_PRUEF_KZ
    , AA.ANSCHRIFT_ART
    , AA.POST_ERG_1
    , AA.STRASSE
    , AA.HAUS_NR
    , AA.POSTFACH
    , AA.PLZ
    , AA.ORT
    , AA.ISO_LAENDER_CODE
    , AA.LAND_KZ



    FROM Z_PERSONEN PE



    JOIN OBJEKT_ZU_ANSCHRIFT OZA
    on oza.ANS_OBJ_ID_TS = PE.PERS_NR
    and oza.ANS_ROLLENART = 'ANSCHRIFT'
    and ( oza.ANS_ROLLE in ('H-WOHNSITZ'
    , 'FIRMENSITZ'
    , 'VERSAND' )
    or (oza.ANS_ROLLENART='KONTAKT-ANS') )


    inner join Z_ADRESSEN AA
    on aa.ANS_ID = oza.ANS_ID



    WHERE PE.PERS_ART = 'P'
    ---



    Der obige Selekt liefert mir folgendes Ergebnis:

    PERSONEN_NR Name ANS_ROLLE STRASSE

    4711 Mustermann VERSAND Bahnhofsstr.

    4711 Mustermann H-WOHNSITZ Kurpark

    4812 Musterfrau H-WOHNSITZ Hauptstr.


    Ich möchte aber pro Personennummer nur einen Datensatz erhalten. Personen, die eine Versandadresse in der Tabelle OZA haben, sollen nur mit dieser ausgegeben werden. Sofern eine Person allerdings KEINE Versandadresse hat, soll dann die Adresse des H-WOHNSITZ ausgegeben werden.

    Leider kenne ich bisher nur die Einschränkung CASE-WHEN-ELSE-END im Select-Bereich. Nach meinem Verständnis müsste die Einschränkung mit "Wenn / Dann / Sonst" ja im WHERE-Bereich des Statements erfolgen.

    Ich hoffe, dass ihr mir trotz der sommerlichen Temperaturen weiterhelfen könnt - ich selbst stehe auf dem Schlauch.

    Vielen Dank vorab und viele Grüße

    Andreas
     
  2. akretschmer

    akretschmer Datenbank-Guru

    was Du suchst ist eher nicht im WHERE-Teil, sondern eine GROUP BY - Abfrage, welche auf PERSONEN_NR gruppiert und auf das / die anderen Merkmale aggregiert.
    Alternativ: mittels Subselect passend eingrenzen
    Alternativ: mittels DISTINCT ON (...) arbeiten - aber das kann nur PostgreSQL.

    Hitze, Urlaub, Rügen, Familie: zu mehr hab ich grad keine Lust. Vielleicht solltest Du ein nachvollziehbares Beispiel zeigen, vereinfacht auf das nötigste. Könnte helfen.
     
    FrenchSpirit gefällt das.
  3. FrenchSpirit

    FrenchSpirit Aktiver Benutzer

    Hallo, akretschmer,
    danke für Deine Antwort - trotz Sommerurlaubs. Viel Spaß auf Rügen, da waren wir auch schon das ein oder andere mal. Zuletzt 2016 im Sommer - herrlich.


    Ich versuche, meinen Sachverhalt noch weiter zu kürzen:

    Select PE.PERSONEN_NR
    , OZA.ANS_ROLLE
    , AA.STRASSE

    FROM Z_PERSONEN PE
    JOIN OBJEKT_ZU_ANSCHRIFT OZA
    on oza.ANS_ID = PE.PERSONEN_NR

    inner join Z_ADRESSEN AA
    on aa.ANS_ID = oza.ANS_ID

    WHERE PE.PERS_ART = 'P'

    Der Selekt liefert mir drei Felder aus den drei Tabellen:

    Der obige Selekt liefert mir folgendes Ergebnis:

    PERSONEN_NR /// ANS_ROLLE /// STRASSE

    4711 /// VERSAND /// Bahnhofsstr.

    4711 /// H-WOHNSITZ /// Kurpark

    4812 /// H-WOHNSITZ /// Hauptstr.


    Da Personennummer 4711 sowohl eine Versandanschrift als auch einen Hauptwohnsitz hat (in Tabelle OZA), wird die Person doppelt geliefert.

    Person 4812 hat nur den Hauptwohnsitz.

    Ich möchte die Ausgabe der Hauptwohnsitze für die Fälle unterbinden, wenn bei derselben Personennummer eine Versandanschrift existiert. Aber eben nur in diesen Fällen - wenn es keine Versandanschrift gibt (wie bei Personennummer 4812), muss der Hauptwohnsitz ausgegeben werden.

    Gruß an die Ostsee, Andreas
     
  4. ukulele

    ukulele Datenbank-Guru

    Ich schwitze auch schon daher skiziere ich das mal in pseudo Code. Du ordnest zunächst deine Adresen und davon joinst du dann nur die erste Zeile:
    Code:
    SELECT *
    FROM tabelle
    LEFT JOIN (
    
    SELECT ROW_NUMBER() OVER (PARTITION BY Fremdschlüssel ORDER BY (CASE WHEN ANS_ROLLE = 'VERSAND' THEN 1 WHEN ANS_ROLLE = 'H-WOHNSITZ' THEN 2 ELSE 3 END)) AS zeile,
    spalten
    FROM adressen
    
    ) a
    ON tabelle.id = a.Fremdschlüssel
    AND a.zeile = 1
     
    FrenchSpirit gefällt das.
  5. FrenchSpirit

    FrenchSpirit Aktiver Benutzer

    Hallo ukulele,

    vielen dank für die Deine Hinweise. Ich werde es hiermit heute abend versuchen :)

    Gruß,
    Andreas
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden