SQL Dubletten herausfiltern, unterschiedl. Kundennamen ignorieren

Lardas

Newbie
Registriert
Aug. 2022
Beiträge
4
Hallo Zusammen,

ich bin neu in der SQL-Welt und komme momentan bei einer Sache nicht weiter.
Ich habe eine Tabelle:

Testtabelle1.PNG


Aus dieser Tabelle möchte ich mir die Datensätze ohne Dubletten anzeigen lassen. Das Problem dabei ist, dass bei machen Kunden der Name unterschiedlich geschrieben ist (z.B. 'Firma A', 'Firma A GmbH' und 'Firma A.').
Aus diesem Grund bekommt man mit DISTINCT kein korrektes Ergebnis. Mit der GROUP BY Funktion kam ich leider auch zu keinem brauchbaren Resultat.

Manche Kunden können auch mehrere Adressen haben (z.B. wenn der Kunde 2 Filialen hat). Solche Datensätze sind dann keine Dubletten.

Nach der SELECT Anweisung würd ich gerne folgendes Ergebnis bekommen:

Ergebnis1.PNG


Also eine Zeile pro Kunde bzw. mehrere Zeilen, wenn der Kunde mehrere Adressen hat (siehe KDNR 1234).
Es spielt auch keine Rolle, welcher der unterschiedlich geschriebenen Kundennamen in der Ergebnisliste letztendlich erscheint.

Kann mir jemand helfen?

Grüße
Lardas
 
Ich weiß nicht ob dies eine Hausaufgabe ist, deswegen gebe ich nur einen kleinen Hinweis.
Die Kundennummer ist eindeutig! Darüber kannst du die verschiedenartigen Adressen finden und am Ende bekommst du über die Kundennummer auch irgendeinen Kundennamen.
 
  • Gefällt mir
Reaktionen: Drexel
Mit Group By KDNR, Straße, PLZ solltest Du doch schon was brauchbares an Basisdaten bekommen. Zumindest gemäß Deiner Beispieldaten, sofern Du bei Straßen nicht das gleiche Schreibweise Problem hast z.B.
Mit Self join über die Kundennr und limitiert auf Top 1 solltest Du dann den Namen wieder ranjoinen können. Mit irgendeinem der Namen, das System kann ja kaum wissen, welcher der richtige ist.
 
Lardas schrieb:
Manche Kunden können auch mehrere Adressen haben (z.B. wenn der Kunde 2 Filialen hat). Solche Datensätze sind dann keine Dubletten.
hat der Kunde dann trotzdem die gleiche Kundennummer?
 
Drexel schrieb:
Mit Group By KDNR, Straße, PLZ solltest Du doch schon was brauchbares an Basisdaten bekommen.
Du meinst so?:

Code:
SELECT KDNR, Strasse, PLZ, ORT
FROM Tabelle
GROUP BY KDNR, Strasse, PLZ, ORT

Drexel schrieb:
Mit Self join über die Kundennr und limitiert auf Top 1 solltest Du dann den Namen wieder ranjoinen können

So vielleicht?:

Code:
SELECT a.KDNR, a.Strasse, a.PLZ, a.ORT, b.Kunde
FROM Tabelle a, Tabelle b
WHERE b.Kunde = (SELECT TOP 1 b.Kunde FROM Tabelle b WHERE a.KDNR = b.KDNR)
GROUP BY a.KDNR, a.Strasse, a.PLZ, a.ORT, b.Kunde

Ich habe das mal getestet in meiner richtigen Datenbanktabelle. Die enthält natürlich deutlich mehr Datensätze und Spalten als die Beispiel-Tabelle hier. Das Ergebnis schien korrekt zu sein (Ich werde es morgen aber nochmal genau prüfen, es sind sehr viele Datensätze). Allerdings lief die Abfrage eine gefühlte Ewigkeit. Deswegen frage ich mich, ob meine SQL Anweisung korrekt ist?

abcddcba schrieb:
hat der Kunde dann trotzdem die gleiche Kundennummer?
ja
 
Ja genauso meinte ich es. Nicht schlecht, dafür dass ich sogar das Sub Select vergessen habe zu erwähnen. :)

Ich denke er muss das SUb Select für jede Zeile einzeln ausführen, das macht es so langsam.

Keine Ahnung ob man das evlt. noch was optimieren kann. Auf welcher DB bist Du unterwegs? Von der Syntax her würde ich auf Oracle tippen.
 
Drexel schrieb:
Auf welcher DB bist Du unterwegs?
SQL Server

Also die Ergebnisse der SELECT Abfrage stimmen. In die Sub Select habe ich noch die Abfrage nach der Strasse eingebaut.
Was mich allerdings noch sehr stört, ist die langsame Geschwindigkeit. Hat jemand vllt. noch Ideen was man da machen kann?
 
Lardas schrieb:
SQL Server

Was mich allerdings noch sehr stört, ist die langsame Geschwindigkeit. Hat jemand vllt. noch Ideen was man da machen kann?
Dazu müßte ich (als alter DB Serviedienstleister in diesem Bereich) erst mal eine Menge Fragen stellen, die Du eigentlich Eurer IT und deren Verantwortlichen stellen solltest:
  • genaue Hardwareausstattung des MS SQL Servers
  • verwendetes OS (genaue Version)
  • verwendete DB Variante und Version
  • Patchlevel
  • interne Settings und Parameter
  • Mit welchem Tool bzw. Client arbeitest Du und setzt Deine SQL Abfragen ab
  • :
 
Da kann man schon noch an der Abfrage optimieren ohne diese Infos ;)
Das aktuelle Query verstehe ich noch nicht so ganz.
Was wolltest du? Im Prinzip doch ein GROUP BY, nur ohne den Kundennamen, richtig?
Dann ist dein Query deutlich zu umständlich (und dadurch auch für den Server aufwändig). Ist das hier nicht dasselbe?

Code:
SELECT a.KDNR, a.Strasse, a.PLZ, a.ORT, MIN(a.Kunde)
FROM Tabelle a
GROUP BY a.KDNR, a.Strasse, a.PLZ, a.ORT

Du hast weiterhin den Kundennamen aus dem Group By ausgeschlossen und bekommst "irgendeine" der Kundenbezeichnungen. Query ist aber viel simpler auszuführen.
 
  • Gefällt mir
Reaktionen: Drexel
Lardas schrieb:
SQL Server

Also die Ergebnisse der SELECT Abfrage stimmen. In die Sub Select habe ich noch die Abfrage nach der Strasse eingebaut.
Was mich allerdings noch sehr stört, ist die langsame Geschwindigkeit. Hat jemand vllt. noch Ideen was man da machen kann?
Probiers mal statt der Subquery mit einem CROSS APPLY oder INNER JOIN (...) jeweils mit deinem SELECT TOP 1. Oft kommt dann am Ende ein besserer execution plan zustande.
Anderer Ansatz wäre eine CTE wo du eine rownum bildest und im zweiten Schritt nur die records mit rownum 1 selektierst damit du deine Kunden unique bekommst.

Edit: Gibt es überhaupt einen (composite) index für die Spalte KDNR?
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Oelepoeto
Enurian schrieb:
Code:
SELECT a.KDNR, a.Strasse, a.PLZ, a.ORT, MIN(a.Kunde)
FROM Tabelle a
GROUP BY a.KDNR, a.Strasse, a.PLZ, a.ORT

Du hast weiterhin den Kundennamen aus dem Group By ausgeschlossen und bekommst "irgendeine" der Kundenbezeichnungen. Query ist aber viel simpler auszuführen.

Glaub Du hast recht, manchmal denkt man einfach zu kompliziert. 🤔
 
Zurück
Oben