Select: Join-Problem (Unvollständigkeit)

MysterioJN

SQL-Guru
Beiträge
158
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

  • select.JPG
    select.JPG
    72,3 KB · Aufrufe: 5
Zuletzt bearbeitet:
Werbung:
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    ...
 
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!!!
 
@ 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!
 
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    ...
 
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...
 
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]' = '')
 
@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    ...
 
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.
 
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 ;)
 
Werbung:
Zurück
Oben