Wenn / Dann / Sonst in Abfrage nutzen

FrenchSpirit

Aktiver Benutzer
Beiträge
41
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
 
Werbung:
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.
 
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
 
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
 
Werbung:
Zurück
Oben