Daten filtern

r.steinberg

Benutzer
Beiträge
8
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
 
Werbung:

ukulele

Datenbank-Guru
Beiträge
4.394
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?
 

r.steinberg

Benutzer
Beiträge
8
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
 

ukulele

Datenbank-Guru
Beiträge
4.394
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.
 

ukulele

Datenbank-Guru
Beiträge
4.394
Mit ID krieg ich es leider nicht hin, sind Referenznummer und Bewegungsnummer zusammen genommen immer eindeutig?
 

r.steinberg

Benutzer
Beiträge
8
Also zu jeder Referenznummer gibt es einen Zähler der immer mit 1 anfängt und mit jeder Bewegung hochgezählt wird.
 

ukulele

Datenbank-Guru
Beiträge
4.394
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
 

r.steinberg

Benutzer
Beiträge
8
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
 
Werbung:
Oben