SQL Abfrage mit Unterabfrage

indi_jonas

Neuer Benutzer
Beiträge
2
Hallo,

ich habe zwei Tabellen und bekomme irgendwie das gewünschte Ergebnis nicht raus, wäre schön, wenn mir hier jemand helfen könnte.

[TABELLE PERSONAL]
PERSONALNR ;SOZIALVERNR; NAME; MITARBEITERSTATUS
1001 | 4711AB99 | MÜLLER | 3 (ausgeschieden)
1002 | 4711AB99 | MÜLLER | 2 (aktiv)
1003 | 4812CH98 | MAIER | 2 (aktiv)

[TABELLE PRAEMIE]
PERSONALNR; PRÄMIE
1001 | Ja

Zeige alle aktiven Mitarbeiter, die ausgeschieden waren und eine Prämie hatten.

1. Finde alle ausgeschiedenen Mitarbeiter mit Prämie.
2. Welche von den ausgeschiedenen Mitarbeitern mit Prämie sind wieder aktiv, quasi Wiedereintritte (Teilmenge von 1).
Der Mitarbeiter lässt sich eindeutig über seine Sozialversicherungsnummer (SOZIALVERNR) ermitteln, die Personalnr ist für den Mitarbeiter nicht eindeutig.

Im Ergebnis hätte ich gerne:
PERSONALNR; SOZIALVERNR; NAME; MITARBEITERSTATUS; PRÄMIE
1001 | 4711AB99 | MÜLLER | 3 (ausgeschieden) | Ja
1002 | 4711AB99 | MÜLLER | 2 (aktiv) |

VIELEN DANK!
 
Werbung:
Dein Datenmodell ist ... merkwürdig.

Code:
edb=*# select * from personal ;
  nr  |  sv  |  name  | status
------+------+--------+--------
 1001 | 4711 | müller |      3
 1002 | 4711 | müller |      2
 1003 | 4812 | maier  |      2
(3 rows)

edb=*# select * from praemie ;
  nr  | praemie
------+---------
 1001 | t
(1 row)

edb=*# select * from praemie left join personal using (nr) where status = 3 and praemie;
  nr  | praemie |  sv  |  name  | status
------+---------+------+--------+--------
 1001 | t       | 4711 | müller |      3
(1 row)

edb=*# with tmp as (select sv, array_agg(nr) nr, array_agg(status) from personal group by sv having array_agg(status) @> array[2,3]), tmp2 as (select sv, unnest(nr) nr from tmp) select * from tmp2 right join praemie on praemie.nr = tmp2.nr;
  sv  |  nr  |  nr  | praemie
------+------+------+---------
 4711 | 1001 | 1001 | t
(1 row)

PostgreSQL, Anpassung an M$SQL überlasse ich Dir zur Übung.
 
Geht das nicht irgendwie einfacher?
Haha, nein, @akretschmer macht es gerne kompliziert und denkt sich in seiner Freizeit kleine Gemeinheiten aus, um es den anderen Forenteilnehmern extra schwer zu machen. ;)

Mal jenseits von SQL, einfach, kompliziert...
Welches Kriterium dient denn in Deinen Daten zur Kennzeichnung der Reihenfolge von Aktivität und Austritt?
. . . . ist Dir was eingefallen? Oder war es "eh klar"? Ja, die Personalnummer? Was daran kennzeichnet die Reihenfolge? Klar: Die Vermutung, dass das unbekannte Verwaltungssystem der Personalabteilung ausschließlich aufsteigende Personalnummern vergibt. Kann stimmen, wäre vlt sogar naheliegend, aber ist für mich nur eine Vermutung. Meinetwegen nehmen wir an, dass es wirklich garantiert so ist.

Um Deine Frage zu beantworten:
Es ist vermutlich noch komplizierter, denn die "Reihenfolge" der Personalnummer wird im vorgeschlagenen Select gar nicht berücksichtigt. Das Ergebnis wäre also hier nur zufällig oder genau in diesem Fall richtig. Aber vielleicht täusche ich mich auch.

Der Vorschlag ist dennoch ein schönes Beispiel wie man klassische Gruppierungsprobleme mit Aggregaten lösen kann, Dein Wunsch nach "einfacher" liegt vermutlich daran, dass es so schöne Möglichkeiten mit MS SQL gar nicht gibt und das Statement nicht funktioniert. Oder hast Du es nicht mal ausprobiert?
 
Werbung:
Zurück
Oben