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

Abfrage mit Vergleich vorheriger Historien

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von derhenry, 29 April 2016.

  1. derhenry

    derhenry Aktiver Benutzer

    Hallo zusammen,
    ich sitze seit gestern vor einem Problem, bei dem ich Eure Hilfe benötige.
    In einer Kundendatenbank habe ich für jeden Kunden einen monatlichen Satz, der u.a. die Vertragsbedingungen enthällt. Diese Bedingungen dürfen im Jahr der Erfassung eines Kunden geändert werden. Danach aber nicht mehr. Im Beispielfall seht Ihr also eine verbotene Änderung von 1234 auf 8888 im Januar 2016, obwohl der Kunde 2015 erfasst wurde.

    Stand Kunde Bedingung Erfassung

    01.08.2015 4711 1234 2015
    01.09.2015 4711 1234 2015
    01.10.2015 4711 1234 2015
    01.11.2015 4711 1234 2015
    01.12.2015 4711 1234 2015
    01.01.2016 4711 1234 2015
    01.02.2016 4711 8888 2015
    01.03.2016 4711 8888 2015
    01.04.2016 4711 8888 2015

    Wir kann ich nun alle Kundennummern abfragen, die
    a) eine erlaubte und
    b) eine unerlaubte Änderung erfahren haben?

    Vielen Dank für Eure Hilfe!
    Grüße und schönes Wochenende!
     
  2. ukulele

    ukulele Datenbank-Guru

    nicht erlaubt:
    Code:
    SELECT   DISTINCT Kunde
    FROM   tabelle
    WHERE   Erfassung != datepart(yyyy,Stand)
    erlaubt (es existieren ausschließlich erlaubte Datensätze):
    Code:
    SELECT   *
    FROM   tabelle
    WHERE   Kunde NOT IN (   SELECT   DISTINCT Kunde
                 FROM   tabelle
                 WHERE   Erfassung != datepart(yyyy,Stand) )
    Es gibt aber noch andere Wege das zu lösen, nicht nur mit NOT IN.
     
  3. derhenry

    derhenry Aktiver Benutzer

    Moin!
    Danke für das Feedback. Aber das haut nicht hin.
    Es kann ja durchaus sein (bzw. ist die Regel), dass es einen Datensatz gibt, bei dem Erfassungs- und Standjahr voneinander abweichen. Relevant ist der Zeitpunkt des Wechsels.
     
  4. ukulele

    ukulele Datenbank-Guru

    Verstehe ich nicht, ein unzulässiger Datensatz definiert sich doch dadurch das Stand in einem anderen Jahr liegt als Erfassung oder irre ich?
     
  5. derhenry

    derhenry Aktiver Benutzer

    Einen neuen Datensatz wird jeden Monat hinzugefügt. Auch, wenn sich an den hier ausschnittweise dargestellten Spalten nichts ändert.
    Wurde der Kunde 2015 erfasst und 2015 die Bedingungen geändert, werden sich Stand- und Erfassungsdatuim in 2016 unterscheiden - und der Vorgang war dennoch zulässig.
    Wurde der Kunde 2015 erfasst und 2016 die Bedingungen geändert, war der Vorgang unzulässig.

    Es kommt also darauf an, ob die Änderung (Bedingungs-ID des Standes <> die des nächsten Standes) im Erfassungsjahr oder danach erfolgte.
     
  6. Dukel

    Dukel Datenbank-Guru

    Wenn irgendwas nicht erlaubt ist kann man ja ein Constraint erstellen. Dann muss man im Nachhinein gar nicht überprüfen, ob es verbotene Aktionen gab.
     
  7. derhenry

    derhenry Aktiver Benutzer

    Tja, manchmal kann man nicht beeinflussen, was die Sachbearbeiter da so machen und muss nachträglich ran.
    Ich habe das Problem jetzt mit einer lag()-Funktion lösen können. In einem ersten Schritt vergleiche ich die Bedingung des Satzes mit seinem Nachfolger und prüfe in einem zweiten Schritt, ob bei Änderungen Jahreswechsel vorliegen. Klappt prima und läuft sogar recht schnell.
    Trotzdem Dank und Gruß!
     
  8. Dukel

    Dukel Datenbank-Guru

    Deswegen für die Zukunft ein Constraint einbauen. Dann kann der Sachbearbeiter nichts falsches eingeben.
     
  9. akretschmer

    akretschmer Datenbank-Guru

    wie würdest du den definieren?
     
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