1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen
  2. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

Daten filtern

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von r.steinberg, 20 März 2012.

  1. r.steinberg

    r.steinberg Benutzer

    Hallo ich bräuchte mal Hilfe.
    Ich habe in einer Tabelle Schrottdatensätze.
    Dies sieht folgender maßen aus.

    Referenz Bewegungs_Nummer Kunden
    100 1 15
    100 2 15
    100 3 471
    100 4 89
    200 1 500
    200 2 500
    350 1 654
    350 2 710

    Es muß nun nach der höchsten Bewegungs_nummer gefilter werden. Das Ergebnis sollen aber alle Kunden sein die zur vorhergehenden Bewegungs_nummer nicht identisch sind.
    In diesem Beispiel referenz 350 und bei der Referenz 100 Bewegungsnummer 4 und 3 mit Kunde 89 und 471. wie bekommt man so etwas hin.
    Für eure Hilfe wäre ich sehr dankbar.
    gruß r.steinberg
     
  2. ukulele

    ukulele Datenbank-Guru

    Versteh ich als Aufgabe nicht.
    - Bei Referenz 350 gibt es keine Bewegungsnummer 4 und 3.
    - Was hat die Referenz überhaupt damit zu tun?
    - Was ist die "vorhergehende Bewegungsnummer"?

    Du musst auf jedenfall mit GROUP BY und max(Bewegungs_Nummer) arbeiten, aber die Zusammenhänge sind mir nicht klar. Wann ist ein Datensatz schrott?
     
  3. r.steinberg

    r.steinberg Benutzer

    hallo ukulele,
    nett das Du dich mit meinem Problem befasst.
    Bewegungsnummer 4 und 3 gibt es nur bei Refernenz 100.
    Dies ist nur ein Beispiel. Die Referenzen sind Objekte die zu einer Kundennummer bewegt werden.
    Schrott ist bei der ganzen Sachen ist das es immer zwei Bewegungsnummern zu einem Kunden geben muss.
    Man könnte noch eine Bewegungsreferenz in die Tabelle mit aufnehmen. Würde heißen z.B bei Referenz 100 Bew.NR 3 und Bew.Ref. A=Auslieferung
    Ref. 100 Bew.Nr 3 und Bew.Ref E=Einlagerung. Das heißt das Objekt wurde für einen Kunden Ausgeliefert und zu einen anderen Kunden Eingelagert.
    Das gleiche für Ref. 350 Bew.Nr. 1 und Bew.Ref. A=Auslieferung und Bew.Nr.2 und Bew.Ref. E=Einlagerung zwei verschiedene Kunden.
    Tut mir leid das ich die Bewegungsreferenz nicht gleich mit in das Beispiel reingenommen habe.
    Ich hoffe, dass das ganze jetzt eindeutiger wird.
    Das Problem ist, dass das ganze nur bei den letzten Bewegungssätzen (Bewegungsnummer) passiert ist. Und zu einem Objekt kann es auch 50 Bewegungsnummern geben.
    gruß r.steinberg
     
  4. ukulele

    ukulele Datenbank-Guru

    Also mal ganz simpel betrachtet hast du 2 Ausschlusskriterien:
    - Es darf nur 2 Bewegungsnummern pro Referenz (Produkt) geben. (Und diese sind nicht immer 1 und 2 sondern können auch höher sein.)
    - Außerdem müssen die Kundennummern beider Referenzen gleich sein, ansonsten sind alle Bewegungen zu dieser Referenznummer ungültig.
     
  5. r.steinberg

    r.steinberg Benutzer

    Ja genau so ist das.
     
  6. ukulele

    ukulele Datenbank-Guru

    Hast du noch eine eindeutige ID Spalte?
     
  7. r.steinberg

    r.steinberg Benutzer

    Ja es gibt in der Tabelle noch eine fortlaufende ID Spalte.
     
  8. ukulele

    ukulele Datenbank-Guru

    Mit ID krieg ich es leider nicht hin, sind Referenznummer und Bewegungsnummer zusammen genommen immer eindeutig?
     
  9. r.steinberg

    r.steinberg Benutzer

    Also zu jeder Referenznummer gibt es einen Zähler der immer mit 1 anfängt und mit jeder Bewegung hochgezählt wird.
     
  10. ukulele

    ukulele Datenbank-Guru

    Also trifft
    gar nicht zu?
    Es darf nur 2 Bewegungsnummern pro Referenz (Produkt) geben, 1 und 2.
     
  11. r.steinberg

    r.steinberg Benutzer

    Ja das ist das Problem das die Fehler nur bei den letzten Bewegungen passiert ist
     
  12. ukulele

    ukulele Datenbank-Guru

    Also ich habe 2 Abfragen die die beiden Ausschlußkriterien berücksichtigen (diese zusammen zu führen wäre noch verwirrender als es schon ist). Die Reihenfolge sollte berücksichtigt werden.

    Kriterium 1: Es darf nur 2 Bewegungsnummern pro Referenz (Produkt) geben. (Und diese sind nicht immer 1 und 2 sondern können auch höher sein.)
    Kriterium 2: Außerdem müssen die Kundennummern beider Referenzen gleich sein, ansonsten sind alle Bewegungen zu dieser Referenznummer ungültig.

    Code 1 wählt alle Gültigen Datensätze aus, die die ersten beiden Bewegungsnummern pro Referenz abbilden:
    Code:
    SELECT    *
    FROM (    SELECT    t2.TabellenID,
                    t2.Kunden,
                    t1.Referenz,
                    t1.Bewegungs_Nummer
            FROM (    SELECT    Referenz,
                            min(Bewegungs_Nummer) AS Bewegungs_Nummer
                    FROM    Tabelle
                    GROUP BY Referenz ) t1,
                    Tabelle t2
            WHERE    t1.Referenz = t2.Referenz
            AND        t1.Bewegungs_Nummer = t2.Bewegungs_Nummer
            UNION ALL
            SELECT    t2.TabellenID,
                    t2.Kunden,
                    t1.Referenz,
                    t1.Bewegungs_Nummer
            FROM (    SELECT    Referenz,
                            min(Bewegungs_Nummer) AS Bewegungs_Nummer
                    FROM    Tabelle
                    WHERE    TabellenID  NOT IN (    SELECT    t4.TabellenID
                                            FROM (    SELECT    Referenz,
                                                            min(Bewegungs_Nummer) AS Bewegungs_Nummer
                                                    FROM    Tabelle
                                                    GROUP BY Referenz ) t3,
                                                    Tabelle t4
                                            WHERE    t3.Referenz = t4.Referenz
                                            AND        t3.Bewegungs_Nummer = t4.Bewegungs_Nummer )
                    GROUP BY Referenz ) t1,
                    Tabelle t2
            WHERE    t1.Referenz = t2.Referenz
            AND        t1.Bewegungs_Nummer = t2.Bewegungs_Nummer ) AS hilfstabelle
    ORDER BY Referenz,Bewegungs_Nummer

    Code 2 wählt alle Gültigen Datensätze aus, deren Kundennummer gleich ist:
    Code:
    SELECT    *
    FROM    Tabelle
    WHERE    TabellenID IN (    SELECT    t1.TabellenID
                    FROM    Tabelle t1,
                            Tabelle t2
                    WHERE    t1.Referenz = t2.Referenz
                    AND        t1.Bewegungs_Nummer != t2.Bewegungs_Nummer
                    AND        t1.TabellenID != t2.TabellenID
                    AND        t1.Kunden = t2.Kunden )
    ORDER BY Referenz,Bewegungs_Nummer
    Ich rate zu sorgfältigen Tests bevor du irgendwelche Daten löscht und natürlich zu einem Backup der gesammten Tabelle.

    Der folgende Code ist von meinem Testsystem mit einer ähnlichen Strukur. Ich will den nur hier ablegen falls ich noch weitere daran basteln muss, für dich habe ich oben die Spalten und Tabellennamen angepasst.
    Code:
    SELECT    *
    FROM (    SELECT    t2.pk,
                    t2.fk_unt,
                    t1.fk_kam,
                    t1.id
            FROM (    SELECT    fk_kam,
                            min(id) AS id
                    FROM    z_kam
                    GROUP BY fk_kam ) t1,
                    z_kam t2
            WHERE    t1.fk_kam = t2.fk_kam
            AND        t1.id = t2.id
            UNION ALL
            SELECT    t2.pk,
                    t2.fk_unt,
                    t1.fk_kam,
                    t1.id
            FROM (    SELECT    fk_kam,
                            min(id) AS id
                    FROM    z_kam
                    WHERE    pk  NOT IN (    SELECT    t4.pk
                                            FROM (    SELECT    fk_kam,
                                                            min(id) AS id
                                                    FROM    z_kam
                                                    GROUP BY fk_kam ) t3,
                                                    z_kam t4
                                            WHERE    t3.fk_kam = t4.fk_kam
                                            AND        t3.id = t4.id )
                    GROUP BY fk_kam ) t1,
                    z_kam t2
            WHERE    t1.fk_kam = t2.fk_kam
            AND        t1.id = t2.id ) AS hilfstabelle
    ORDER BY fk_kam,id
    
    SELECT    *
    FROM    z_kam
    WHERE    pk IN (    SELECT    t1.pk
                    FROM    z_kam t1,
                            z_kam t2
                    WHERE    t1.fk_kam = t2.fk_kam
                    AND        t1.id != t2.id
                    AND        t1.pk != t2.pk
                    AND        t1.id IN ( 2,3,9,10 )
                    AND        t2.id IN ( 2,3,9,10 )
                    AND        t1.fk_unt = t2.fk_unt )
    ORDER BY fk_kam,id
     
    Walter gefällt das.
  13. r.steinberg

    r.steinberg Benutzer

    Hallo ukulele,
    vielen dank damit werde ich jetzt mal testen.
    Ich werde Dir dann mitteilen wie es ausgegangen ist.
     
  14. r.steinberg

    r.steinberg Benutzer

    Hallo ukulele,
    habe heute vom kunden noch zusätzliche kriterien bekommen wonach ich eingrenzen muss.
    Konnte dies jetzt aber durch ein paar views beheben. Zumal der Kunde mir heute gesagt hat das eindeutige Kriterium ist Bew.Ref. E

    nochmal vielen vielen Dank.

    gruß r.steinberg
     
  15. ukulele

    ukulele Datenbank-Guru

    Eindeutige Kriterien sind immer der Schlüssel zum Erfolg :)
     

Diese Seite empfehlen