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

Doppelte Werte nicht anzeigen

Dieses Thema im Forum "DB2" wurde erstellt von DBNewbie, 6 Februar 2021.

  1. DBNewbie

    DBNewbie Neuer Benutzer

    Hallo Zusammen,

    habe folgendes Problem
    Ziehe mir Daten aus 3 Tabellen
    Join klappt

    Problem ich bekomme Daten mehrfach ausgegeben und möchte

    jede "Collinummer" zu einer "interneRef" nur einmal mit dem neuesten "Datum" und der neuesten "Zeit" ausgegeben haben

    Beispiel:
    Interne Referenz: 50030097 mit den Collinummern: 902715 & 902716 (je 2 Einträge)

    Wie bekomme ich das hin :(
    (Bestimmte Felder habe ich in der Abfrage aber gebe sie nicht aus also nicht verwirren lassen) 01.jpg 02.jpg

    SQL:

    select b.Kundenreferenz,
    c.Collinummer,
    c.Ort,
    a.InterneRef,
    a.1 as ColliAnzahl,
    a.Gewicht,
    c.Datum,
    c.Zeit,
    c.Zaehler,
    c.Vorgangsart
    --a.Filiale,

    --a.Abteilung
    --a.InterneReferenz2
    --a.Auftragsdatum

    from a
    join c on a.Filiale=c.Filiale and a.Abteilung=c.Filiale and a.InterneRef=c.InterneRef and
    a.InterneReferenz2=c.InterneReferenz2

    join b on a.Filiale=b.Filiale and a.Abteilung=b.Abteilung and a.InterneRef=b.InterneRef and
    a.InterneReferenz2=b.InterneReferenz2

    where a.Filiale=80807 and Abteilung='Versand' and Auftragsdatum>200101 and
    Ort='REGAL1' and Vorgangsart = 'LAG'


    order by InterneRef, COLLINUMMER, Datum, Zeit


    ***********************



    01.jpg

    Beispiele:
    Zeile 14+16 sind doppelt und sollen nicht angezeigt werden
    Zeilen 5+6+7+8 kommen mehrfach vor und nur Zeile 8 soll angezeigt werden
    Kriterium: neuesestes Datum und Zeit + höchster Zähler

    02.jpg
    Vielen Dank für eure Mithilfe
    Grüße
    Erik
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Warum speicherst Du Datum und Zeit in unterschiedlichen Spalten? Das macht es schon mal nicht einfacher. Warum Bilder und keine SQL-Befehle, um sich vielleicht mal die Tabellen schnell zu erzeugen? Das macht es nicht einfacher, Dir zu helfen.

    das klingt nach einer Aggregation dieser Werte. Vermutlich willst Du also Tabelle C vor dem Joinen passend aggregieren.
     
  3. DBNewbie

    DBNewbie Neuer Benutzer

    Hallo Akretschmer,

    Datum & Zeit sind leider in der DB so gespeichert.
    Mit Groupby habe ich schon experimentiert und komme nicht zum gewünschten Ergebnis

    Ich möchte quasi am Ende nur die Fett dargestellten Zeilen als Ergebnis haben.
    Sorry, bin ein blutiger Anfänger :(




    COLLINUMMER| Ort | InterneRef | ColliAnzahl | Gewicht | Datum | Zeit | ZAEHLER | Vorgangsart
    --------------------- | ----------- -------------- | -------------- | ----------- | ----------- | ----------- | ------------ | ---------------|---------------
    115784 | REGAL1 |49706538 | 1 | 21.1 | 201106 | 100641 | 2 | LAG
    115784 | REGAL1 |49706538 | 1 | 21.1 | 201109 | 90732 | 3 | LAG
    115784 | REGAL1 |49706538 | 1 | 21.1 | 201109 | 95212 | 4 | LAG
    115784 | REGAL1 | 49706538 | 1 | 21.1 | 210201 | 100220 | 5 | LAG
    320451 | REGAL1 | 49720164 | 1 | 9.3 | 210201 | 100436 | 2 | LAG
    584926 | REGAL1 | 50009521 | 1 | 112.8 | 210201 | 101751 | 2 | LAG
    814864 | REGAL1 | 50025305 | 1 | 9.3 | 210201 | 100643 | 2 | LAG
    847509 | REGAL1 | 50029734 | 1 | 237.2 | 210201 | 101808 | 2 | LAG
    847519 | REGAL1 | 50029760 | 1 | 49.0 | 210201 | 103213 | 2 | LAG
    902715 | REGAL1 | 50030097 | 1 | 12.1 | 210201 | 103045 | 2 | LAG
    902715 | REGAL1 | 50030097 | 1 | 12.1 | 210201| 103045 | 2 | LAG
    902716 | REGAL1 | 50030097 | 1 | 12.1 | 210201 | 103109 | 2 | LAG
    902716 | REGAL1 | 50030097 | 1 | 12.1 | 210201| 103109 | 2 | LAG
    902695 | REGAL1 | 50030107 | 1 | 15.8 | 210201 | 103105 | 2 | LAG
    902695 | REGAL1 | 50030107 | 1 | 15.8 | 210201| 103105 | 2 | LAG
    902696 | REGAL1 | 50030107 | 1 | 15.8 | 210201 | 103048 | 2 | LAG
    902696 | REGAL1 | 50030107 | 1 | 15.8 | 210201| 103048 | 2 | LAG
    902697 | REGAL1 | 50030131 | 1 | 13.8 | 210201 | 103039 | 2 | LAG
    902697 | REGAL1 | 50030131 | 1 | 13.8 | 210201| 103039 | 2 | LAG
    902698 | REGAL1 | 50030131 | 1 | 13.8 | 210201 | 103052 | 2 | LAG
    902698 | REGAL1 | 50030131 | 1 | 13.8 | 210201| 103052 | 2 | LAG
    902685 | REGAL1 | 50030136 | 1 | 15.8 | 210201 | 103042 | 2 | LAG
    902685 | REGAL1 | 50030136 | 1 | 15.8 | 210201 | 103042 | 2 | LAG
    902686 | REGAL1 | 50030136 | 1 | 15.8 | 210201 | 103059 | 2 | LAG
    902686 | REGAL1 | 50030136 | 1 | 15.8 | 210201 | 103059 | 2 | LAG
    895629 | REGAL1 | 50032032 | 1 | 4.4 | 210201 | 111237 | 2 | LAG
    874754 | REGAL1 | 50032035 | 1 | 316.0 | 210201 | 111201 | 2 | LAG
    874753 | REGAL1 | 50032038 | 1 | 71.5 | 210201 | 111154 | 2 | LAG
    144147 | REGAL1 | 50035329 | 1 | 223.0 | 210201 | 100753 | 2 | LAG
    132894 | REGAL1 | 50035978 | 1 | 367.5 | 210201 | 100556 | 2 | LAG
    967766 | REGAL1 | 50035994 | 1 | 13.0 | 210201 | 111213 | 2 | LAG
    874231 | REGAL1 | 50036343 | 1 | 662.0 | 210201 | 111146 | 2 | LAG
    874231 | REGAL1 | 50036343 | 1 | 662.0 | 210201 | 111146 | 2 | LAG
    874232 | REGAL1 | 50036343 | 1 | 662.0 | 210201 | 111148 | 2 | LAG
    874232 | REGAL1 | 50036343 | 1 | 662.0 | 210201 | 111148 | 2 | LAG
     

    Anhänge:

  4. dabadepdu

    dabadepdu Datenbank-Guru

    .. in der DB so gespeichert.
    Ist das tatsächlich so oder glaubst Du es nur oder willst Du hier nur den Eindruck erwecken?

    Wenn man sich "Tabelle" C so anschaut, würde man sich fragen, ob das wirklich eine Tabelle ist.
    Denn sie speichert eine große Menge redundante Daten.

    Das bedeutet, entweder
    - ist das eine total schlecht designte Tabelle
    - oder ein View
    - oder ein Select Statement
    - oder es ist nur Fanatsie

    Um also Dein Problem zu lösen, müsste man vielleicht einen Schritt zurück treten und fragen:
    Versuchst Du dort etwas "aufzudröseln", was bereits ordentlich aufgedröselt im Original vorliegt- ohne dass Du es weißt?

    Gibt es jemand, der das System kennt? Sind die "Tabellen", die Du abfragst, vielleicht Interface Views oder Reporting Schnittstellen?
     
  5. DBNewbie

    DBNewbie Neuer Benutzer

    Also fangen wir mal damit an warum weshalb...

    Tabelle a (enthält die Auftragsdaten)der DB befinden sich 312 Felder
    Primary key ist quasi die "InterneReferenz"
    Weitere Felder sind z.B. Absender Name, Adresse, Postleitzahl, Ort, Empfänger Name, Gesamtgew. der Sendung Abrechnungskennzeichen zur jeweiligen Sendung etc.

    Tabelle b (Sendungsblöcke) der DB befinden sich 38 Felder
    Primary Key ist die "Interne Referenz"
    Weitere Felder sind z.B. Lieferscheinnummer des Kunden Einzelgewicht der Position, verpackungsarten etc.

    Jede Sendung aus der Tabelle a kann mehrere Sendungsblöcke haben
    D.h. 1 Sendung mit 2 Karton und 3 Kisten kann 5 Sendungsblöcke in der Tabelle b enthalten.

    Tabelle c (Sendungsstatus) der Db befinden sich 35 Felder
    Primary Key ist die "Interne Referenz"
    Weitere Felder sind z.B. Collinummer, Art der Der Scannung (Vorgangsart)wann wurde die Sendung gescannt ("Datum" und "Zeit")

    Ich will immer den letzten Scan einer Sendung mit dem entsprechenden Ort sehen.

    Was passiert bei meiner Abfrage:
    Zu einer Sendungsnummer (InternerneReferz) will ich die entsprechenden Collinummern und die entsprechenden Scannungen sehen

    bei einer Sendung mit 5 Colli bekomme ich 5 Datensätze ausgegeben ; das ist soweit O.K.
    jedes Colli wird mehrfach gescannt weil bei einer Inventur alle collis gescannt werden müssen.
    Nach 3 durchgeführten Inventuren bekomme ich
    bei einer Sendung mit 5 Colli 15 Datensätze aber ich will nur die letzte Scannung angezeigt bekommen d.h. nur 5 Datensätze

    Nun: wie komme ich an mein Ziel?
    Mit Distinct bin ich irgendwie nicht weitergekommen
    Eventuell muss man ein Subselect einfügen aber ich bin da echt Neuling und habe kläglich versagt

    Über das Design der DB möchte ich mich nicht äußern außer es ist halt "gewachsen"
    den Rest überlasse ich Deiner Phantasie
     
  6. dabadepdu

    dabadepdu Datenbank-Guru

    Ok, das wollte ich wissen. Aus der Ferne kommt es mir redundant vor. Aber mag sein, dass es irgendeinen tieferen Sinn gibt, lauter Felder mehrfach zu speicher, ohne dass sie sich ändern.
    Es wäre Doch schade, hier aufwändige Abfragen zu machen, wenn es nebenan schon separat bereit liegt.

    Du musst Tabelle C aggregieren und das Maximum der Zeit ausgeben. Damit es weiterverwendbar ist, brauchst Du den PK, also die Collinummer.
    Select collinummer, max(zeit) from "tabelle c" group by collinummer
    Das wäre das Prinzip. Du musst sehr wahrscheinlich noch das Datum mit rein nehmen, auch wenn in Deinen Beispieldaten das Datum je Colli identisch ist.
     
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