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

Select: Join-Problem (Unvollständigkeit)

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von MysterioJN, 8 Juli 2015.

  1. MysterioJN

    MysterioJN Datenbank-Guru

    Hallo zusammen,

    mein erster Eintrag in diesem Forum; natürlich mit einer Fragestellung :)

    Kurze Erläuterung der IST-Situation:
    - Zwei Tabellen (tab = Bestellungen; vtadressen = Kundendaten)

    Es sollen vom Nutzer im "Front-End" (DNN) Abfragekriterien gewählt werden können, die sich herkunftsmäßig sowohl auf die:
    - "tab" Tabelle beziehen
    (Hier werden Dank "Left Join" auch wirklich alle Bestellungs-Datensätze der tab angezeigt, egal ob die Kunden in der vtadressen nicht mehr vorhanden sind)

    - ein Wert (PLZ) der sich auf die Herkunft aus der "vtadressen" Tabelle bezieht:
    (Hier werden LEIDER nur wirkliche Treffer der vtadressen angezeigt, was das Gesamtergebnis der Bestellungen verfälscht).

    Angewendeter Select:
    Code:
    SELECT
    Year(tab.tad) as Jahr,
      Month(tab.tad) as Monat,
    tab.knr as KdNr,
    vtadressen.an,
    vtadressen.nn as Nachname, 
    vtadressen.fi as Firma,
    vtadressen.mail,
    vtadressen.tel,
    vtadressen.plz,
    tab.st as Stueck,
    tab.anr as Artikel,
    tab.akz,
    tab.bcode as B,
    vtadressen.rgr as KG,
    IF(vtadressen.werbung_post =1,'ja','nein') as P,
    IF(vtadressen.werbung_email =1,'ja','nein') as E
    FROM tab
    LEFT JOIN vtadressen ON tab.knr = vtadressen.knr
    WHERE (((tab.status) = 'versendet') AND (anr LIKE '[PARAMETER:ANR]%') AND (st>= '[PARAMETER:ST]') AND (vtadressen.plz LIKE '[PARAMETER:PLZ]%')   AND (tab.bcode LIKE '[PARAMETER:Branche]%') AND (tab.akz LIKE '[PARAMETER:Aktion]%') AND (Year(tab.tad) LIKE '%[PARAMETER:Jahr]%') ) 
    Mir macht echt der Part mit dem Kriteriumsbezug auf die Postleitzzahl (PLZ) die Probleme (Rot markiert im Bild), das nicht alle Bestellungsdatensätze angezeigt werden, obwohl die Abfrage den richtigen Join verwendet....

    Nehme ich die Möglichkeit der Kriteriumswahl auf die Postleitzahl raus, ist das Ergebnis vollständig, aber keine Möglichkeit mehr gegeben, nach Postleitzahlen zu filtern.

    Kann ich an der Stelle des Bezuges auf das Kriterium Postleitzahl mitteilen, das er auch nicht vorhanden als leer anzeigen soll? Sprich sich nach dem zuvor gewählten Left Join richten und nicht an der Stelle ihn außer Acht lassen soll.

    Hoffe ich konnte mich halbwegs ausdrücken. Hab auch noch nicht so viel Erfahrung mich mit sql mitzuteilen....

    Viele Grüße und Danke fürs lesen und vlt. sogar helfen!!!!

    Myst
     

    Anhänge:

    Zuletzt bearbeitet: 8 Juli 2015
  2. Distrilec

    Distrilec Datenbank-Guru

    Problem? Du kannst evtl. unerwünschte Datensätze erhalten... Da die PLZ auch für andere Kunden Null sein kann.
    (Warum auch immer man seine Kundendaten löschen wollen sollte. Unverständlich mMn... )

    Ansonsten wäre das der einzig MÖGLICHE Ansatz.
    Aber wie gesagt... Es können (abhängig von den anderen Parametern) auch unerwünschte Datensätze auftauchen
    Code:
    Select ...
    From   tab
    
    Left   Join vtadressen
    On     tab.knr = vtadressen.knr
    
    Where  ...
    And    (vtadressen.plz Like '[PARAMETER:PLZ]%'
            Or vtadressen.plz Is Null)
    And    ...
     
  3. MysterioJN

    MysterioJN Datenbank-Guru

    Ich werde deine Ansatz mal ausprobieren, wobei Ich mir nicht sicher bin, ob es das lösen wird aus folgendem Grund:

    Es wurden einige Kundendaten (aus auch mir unverständlichen Gründen) aus dem kundenstamm (vtadressen) gelöscht.

    In der tab wurden die Referenzen durch die kundennummer (knr) am Tag und mit der Bestellung gespeichert, die aber auf Grund von Adresslöschungen ins leere führen können.

    Dennoch ist es wichtig, den Abfluss in Stück aufzuzeigen, auch wenn man nicht mehr weiß an wen.

    Das klappt ohne das Kriterium PLZ dank left join. Nur mit wirklich nur wenn beide Datensätze referenziert werden können.

    Ich teste es morgen mal mit deiner Idee. Vlt denk Ich auch nur falsch.

    Tausend dank auf jeden Fall schoneinmal fürs antworten!!!
     
  4. akretschmer

    akretschmer Datenbank-Guru

    Datenbanken können sowas verhindern. Das sollte man dann auch nutzen.
     
  5. MysterioJN

    MysterioJN Datenbank-Guru

    @ akretschmer: du würdest den Kopf schütteln wenn du die Datenbank unseres Dienstleisters kennen würdest (um die es hier auch geht!). Sprich wir haben nur bedingt Einfluss auf deren Datenhaltung.

    @ distrilec: MENSCH DU BIST DER BESTE !!!!! Es hat tatsächlich geklappt.
    Wobei ich noch einen Optimierungswunsch deiner Where-Bedingung an dich hätte (sofern möglich):

    Wenn ich das
    " Where ... And (vtadressen.plz Like '[PARAMETER: PLZ]%' Or vtadressen.plz Is Null) "
    Parameter Feld PLZ leer lasse, klappt es.

    Wenn ich aber einen Wert eintrage, zeigt er mir natürlich dann auch die "Or vtadressen.plz Is Null" mit an.

    Frage: Kann man daraus eine wenn/dann bauen:
    - wenn PLZ-ParameterFeld = leer ist, dann mit "OR .... IS NULL"
    - wenn PLZ-ParameterFeld = eine Eintragung hat, dann ohne "OR .... IS NULL".

    Ist das möglich? Ich habe gerade erst meine ersten Stunden im SQL-Bereich hinter mir und lern zwar recht schnell, aber das hab ich jetzt noch nicht hinbekommen. In Excel kein Problem ;)

    Beste Grüße!
     
  6. Distrilec

    Distrilec Datenbank-Guru

    Nichts leichter als das :)
    Code:
    Select ...
    From   tab
    
    Left   Join vtadressen
    On     tab.knr = vtadressen.knr
    
    Where  ...
    And    (vtadressen.plz Like '[PARAMETER:PLZ]%'
            Or (vtadressen.plz Is Null And '[PARAMETER:PLZ]' Is Null))
    And    ...
    Mir fällt gerade auf:
    Warum funktioniert unten das nicht? Was übergibst du denn als "[PARAMETER: PLZ]", wenn dieser Null ist ? Denn eigentlich müsste dieses Pattern '%' auch Nulls erkennen.
    So stehts zumindest in der T-SQL Doku :)
    Code:
    Select ...
    From   tab
    
    Left   Join vtadressen
    On     tab.knr = vtadressen.knr
    
    Where  ...
    And    vtadressen.plz Like '[PARAMETER:PLZ]%'
    And    ...
     
  7. MysterioJN

    MysterioJN Datenbank-Guru

    Ich glaube das "%" steht nur als Suchergänzungserweiterung(Platzhalter?!) mit dabei. Wenn ich "5312" eingebe, das er alles rechts nach der "5312" auch mit ausgibt.

    Wenn ich das Feld in der Abfragemaske leer lasse, übergibt er nichts und er zeigt wirklich alles an. Also auch die "nulls". Wenn ich aber eine Eintragung vornehme, zeigt er mir alle zutreffenden Werde dieser Postleitzahl an (Beispiel "53123" alle Datensätze mit dieser PLZ, aber AUCH die "null"s-Datensätze).

    Deine Anpassung habe ich eingebaut. Jetzt funktioniert zwar die Ausgabe wenn ich eine PLZ angebe ohne die Anzeige der "null"s-Datensätze (Perfekt!), aber wenn ich keine PLZ angebe, werden die "null"-s wieder nicht angezeigt (sprich Ursprungsproblem).

    Hmmm... vlt müssen wir einfach damit leben jedesmal die "Leichen" bei einer Postleitzahlsuche raus zu löschen beim Excel-Export.

    Screenshots könnten echt besser erklären, hätte ich nicht das Datenschutzproblem...
     
  8. ukulele

    ukulele Datenbank-Guru

    Wie wärs mit
    Code:
    Where  ...
    AND (vtadressen.plz Like '[PARAMETER:PLZ]%'
    OR (vtadressen.plz Is Null And '[PARAMETER:PLZ]' IS NULL)
    OR '[PARAMETER:PLZ]' = '')
     
  9. Distrilec

    Distrilec Datenbank-Guru

    @ukulele Also ist bei MS SQL '' != Null ? Das ändert natürlich so einiges...

    Code:
    Select ...
    From   tab
    
    Left   Join vtadressen
    On     tab.knr = vtadressen.knr
    
    Where  ...
    And    (vtadressen.plz Like '[PARAMETER:PLZ]%'
            Or (vtadressen.plz Is Null And '[PARAMETER:PLZ]' = ''))
    And    ...
     
  10. ukulele

    ukulele Datenbank-Guru

    Das ist hoffentlich bei allen SQLs so! :) Das eine ist ein String mit 0 Zeichen Länge (kann natürlich auch ein Leerschritt drin sein, könnte man auch abfangen) und das andere ist eben kein String sondern NULL.
     
  11. MysterioJN

    MysterioJN Datenbank-Guru

    Da bau ich gerade eine Musterabbildung und schwupps wird hier mein Anliegen gelöst!! Das war es ! Perfekt. Mensch, ihr seid beide genial. Ich hoffe, auch irgendwann mal so fit zu werden.
    Herzlichsten Dank! Momentan kann ich keinen weiteren Fehler mehr finden. Dann geh ich mal auf die Suche, wie man einen berechneten Wert in zwei nachkommastellen formatiert.

    Dank euch!!! Vor allem für das sehr schnelle Feedback und die aufgewendete Zeit.
    Ich glaub ich bin hier gut aufgehoben zukünftig ;)
     
  12. Distrilec

    Distrilec Datenbank-Guru

    Wie wärs mit der tollen Funktion
    Code:
    round(1.234, 2)
     
  13. MysterioJN

    MysterioJN Datenbank-Guru

    *räusper* Ich habs mit Format(1234, '#.##') versucht. Danke auch hierfür!
     
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