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

aktuellsten Vertrag einer Person anzeigen lassen

Dieses Thema im Forum "Oracle" wurde erstellt von gurbelunder, 5 Mai 2015.

  1. gurbelunder

    gurbelunder Datenbank-Guru

    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
     
  2. Distrilec

    Distrilec Datenbank-Guru

    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)
     
  3. akretschmer

    akretschmer Datenbank-Guru

    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.
     
  4. Distrilec

    Distrilec Datenbank-Guru

    @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.
     
  5. gurbelunder

    gurbelunder Datenbank-Guru

    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
     
  6. Distrilec

    Distrilec Datenbank-Guru

    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....
     
  7. gurbelunder

    gurbelunder Datenbank-Guru

    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.
     
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