aktuellsten Vertrag einer Person anzeigen lassen

gurbelunder

SQL-Guru
Beiträge
136
Moin Leute,

heute habe ich mal wieder einen "StehAufDemSchlauch" Tag. Folgende Struktur:

eine Tabelle, eine View:

V_VERTRAG_PERSON_STATUS

hier drin steht, welche VertragsID welcher PersonID zugwiesen ist. Da die PersonID den Vertrag wechseln kann und somit einen Statuswechsel durchlebt, gibt es zu den meisten Personen auch mehrere VertragsID's.

ID | PERSON_ID | PERSON_STATUS | STATUS_CODE (nur für die Übersicht interessant)

T_VERTRAGSZEITEN

hier werden die Laufzeiten der Verträge durch ein setzen von Start- und Enddatum definiert, Enddatum kann NULL sein. Allerdings kann der aktuellste Vertrag auch ein Enddatum besitzen (Beispiel Freelancer).

ID | VERTRAG_ID | STARTDATUM | ENDDATUM

Nun versuche ich gerade, aus diesen beiden Tabellen eine View zu bauen, die mir zu jeder PersonID die aktuelle VertragsID anzeigt. Da sich leider immer der Status mit der neuen VertragsID ändert, bekomme ich auf diese Weise alle Vertragswechsel einer PersonID.

Code:
CREATE OR REPLACE VIEW V_VERTRAG_VERTRAGSZEIT_PERSON AS
SELECT DISTINCT v.ID, v.PERSON_ID, v.PERSON_STATUS, vz.STARTDATUM, vz.ENDDATUM
FROM V_VERTRAG_PERSON_STATUS v, T_VERTRAGSZEITEN vz
WHERE v.ID = vz.VERTRAG_ID
AND vz.STARTDATUM < SYSDATE
--AND ENDDATUM IS NULL
AND vz.STARTDATUM IN
(
  SELECT MAX(vz2.STARTDATUM)
  FROM T_VERTRAGSZEITEN vz2
  WHERE vz2.VERTRAG_ID = v.ID
)
ORDER BY v.PERSON_ID;

Die Idee, nach dem aktuellsten Startdatum zu suchen ist so das erste Filterkriterium. Einfach mit fragen, welche Datensätze ENDDATUM IS NULL aufweisen, ist hier inhaltlich falsch, daher auskommentiert.

Kann mich mal einer nach rechts heben, damit der Schlauch wieder frei wird?

Danke euch und Grüße,
David
 
Werbung:
Jetzt einfach mal "freestyle"... Da ich ja keine Daten hab... :)
Code:
Select vps.id
      ,vps.person_id
      ,vps.person_status
      ,v.startdatum
      ,v.enddatum

From   v_vertrag_person_status vps

Inner  Join t_vertragszeiten v
On     v.vertrag_id = vps.id

Where  Sysdate Between v.startdatum And coalesce(v.enddatum, Sysdate)
(Solltest du noch ne 8er Version verwenden musst du das coalesce durch nvl ersetzen)
 
Vermutlich versteh ich grad das Problem nicht vollständig, aber was spricht dagegen, aus der t_vertragszeiten erst einmal via select vertrag_id, max(startdatum) from ... group by vertrag_id die aktuelle vertrag_id zu ermitteln? Dagegen dann einfach joinen.

Falls meine Vermutung aber stimmt, dann zeige mal grob paar Demo-Daten und was bei rauskommen soll.
 
@akretschmer: Soweit ich das verstande habe, ist der Vertrag mit dem größten Startdatum nicht unbedingt auch der derzeit laufende Vertrag ... Da der ja wieder beendet sein kann, während ein älterer Vertrag immernoch weiterläuft.
 
Erst mal danke für eure Antworten. @akretschmer : Distrilec hat Recht. Was mache ich mit den Verträgen, die ausgelaufen sind? Die möchte ich auch sehen.

@Distrilec : Deine Abfrage kann nicht funktionieren, da es in der V_VERTRAG_PERSON_STATUS die PERSON_ID nicht gibt.

Ich bin gerade daran, das ganze anders aufzubauen, es sind Felder in vorher grundlegenden Tabellen vorhanden, die ich aufgrund ihres Bezeichners erst mal außen vor gelassen habe. Ich würde euch das noch mal zusammen stellen, wenn sich dazu was ergibt. Daten gibt es sicherlich keine aus dem produktiven HR System meiner Firma :D :p
 
Also wenn ich etwas anhand DEINER Vorlage mache... Dann komm mir nicht mit "Spalte x gibts da garnicht".... Guck dir mal an was du mir gegeben hast...

Mal ganz davon abgesehen wie sinnvoll es ist die Person_ID an der Stelle nicht zu haben....
 
Werbung:
Stimmt, da habe ich mich verschrieben. Aber da sich das Datenmodell mir gerade wieder anders erklärt, muss ich mir mal um die Grundstruktur der View erst mal einen Kopf machen. Sorry für's vertippen.
 
Zurück
Oben