SQL Frage / Window Function

Mr. Robot

Fleissiger Benutzer
Beiträge
88
Hallo zusammen,

ich habe eine Tabelle folgender Form:

upload_2021-4-9_13-28-22.png

Ich möchte nun über Mahn_ID das Maximum der Mahnstufe bilden. Dabei soll RNR die mit MG beginnen ignoriert werden. Das habe ich wie folgt erreicht:

,MAX(CASE WHEN LEFT(RNR, 2) = 'MG' THEN NULL ELSE MAHNSTUFE END)
OVER (PARTITION BY MAHN_ID) AS MAX_MAHNSTUFE

Frage:
Wenn in RNR nur MG alleine steht oder nur MGs enthalten sind, so soll die Mahnstufe nicht ignoriert werden. Wie kann ich das am besten erreichen?
 
Werbung:
ich denke, coalesce() ist Dein Freund. Wenn Du a) die Daten Copy&Paste-fähig gezeigt hättest und b) noch ein Beispiel dazu könnte man es direkt mal ausprobieren...
 
mal vereinfacht, die Anpassung an Deine Tabelle & Daten überlasse ich Dir zur Übung:

Code:
edb=*> select * from bla;
 rnr | stufe
-----+-------
 a   |     3
 a   |     5
 a   |     7
 a   |     1
 b   |     2
 b   |     4
 c   |     5
 c   |     7
(8 rows)

edb=*> select rnr, coalesce(max(stufe) filter (where rnr != 'c'), max(stufe) filter (where rnr = 'c')) from bla group by rnr;
 rnr | coalesce
-----+----------
 a   |        7
 b   |        4
 c   |        7
(3 rows)

edb=*>
 
Die Filter Funktion gibt es für den SQL Server nicht... deswegen habe ich es wie folgt umgeschrieben:

COALESCE(CASE WHEN LEFT(RNR,2) != 'MG' THEN Mahnstufe END,
CASE WHEN LEFT(RNR,2) = 'MG' THEN Mahnstufe END)

Das mit dem MAX stimmt ja noch nicht so ganz... eine PARTITION BY MAHN_ID fehlt mir noch. Und ein GROUP BY RNR war nicht vorgesehen.
 
Da, wie gesagt, das Bild nicht Copy&Paste - fähig ist und auch das gewünschte Resultat noch immer geheim ist, habe ich aus dem Rest der Beschreibung extrahiert, daß eine Window-Funktion offensichtlich nicht erforderlich ist.
 
Das gewünschte Resultat ist die Spalte MAX_MAHNSTUFE. Nur wenn es einen Datensatz mit MG gibt soll die Stufe ausgegeben werden, was in meiner Abfrage nicht der Fall ist :oops:

Aber ich denke ich hab es jetzt lösen können. Neben

,MAX(CASE WHEN LEFT(RNR, 2) = 'MG' THEN NULL ELSE MAHNSTUFE END) OVER (PARTITION BY MAHN_ID) AS MAX_MAHNSTUFE

brauch ich noch

,MAX(CASE WHEN LEFT(RNR, 2) != 'MG' THEN NULL ELSE MAHNSTUFE END) OVER (PARTITION BY MAHN_ID) AS MAX_MAHNSTUFE_2

und muss beide in ein COALESCE() verpacken. Also der Ansatz hat mir schon geholfen denke ich. Danke :)
 
Werbung:
Zurück
Oben