SQL Dubletten entfernen / unterschiedliche Kundennamen ignorieren

Lardas

Neuer Benutzer
Beiträge
3
Hallo Zusammen,

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

Kunden.PNG

Aus dieser Tabelle möchte ich die doppelten Einträge entfernen. Das Problem dabei ist, dass bei machen Kunden der Name unterschiedlich geschrieben ist
(z.B. Firma A, Firma A GmbH und Firma A.). Es handelt sich aber um den selben Kunden. KDNR, Strasse, PLZ und ORT sind immer identisch.
Wenn ich die Datensätzen mit DISTINCT vergleiche, sind diese nicht komplett identisch und werden somit nicht als Dublette herausgefiltert.
Über die GROUP BY Funktion besteht im Prinzip das selbe Problem.

Als Ergebnis würde ich gerne eine Liste haben mit nur einem Kunden(namen). Der Name des Kunden spielt dabei keine Rolle. Es ist also egal ob 'Firma A'
oder 'Firma A GmbH' dran steht. Das Ergebnis sollte dann z.B. so aussehen:

Ergebnis.PNG

Kann mir jemand helfen?

Grüße
Lardas
 
Werbung:
Es gibt viele Wege das zu tun, ich gehe mal davon aus du willst die Datensätze erstmal nur sehen oder gleich ungesehen löschen?
Code:
SELECT *
FROM tabelle
WHERE KDNR IN (
SELECT KDNR
FROM tabelle
GROUP BY KDNR
HAVING count(*) > 1
)
ORDER BY KDNR;
Hier wird jetzt nur auf die Kundennummer abgestellt, es können ja auch Straße oder sonst was falsch geschrieben sein.
 
Hallo ukulele,

danke für deine Antwort.

Zu deiner Frage: Die doppelten Datensätze sollen nach der SELECT Anweisung nicht angezeigt werden, pro Kunde nur ein Datensatz.
ABER! (Das habe in meinem Beispiel oben vergessen zu erwähnen):
Es kann durchaus sein, dass ein Kunden unterschiedliche Adressen hat (z.B. wenn er 2 Filialen hat).
Falls das der Fall ist, soll der Kunde natürlich NICHT als Dublette entfernt werden. Dann sollen tatsächlich 2 (oder auch mehr) Datensätze
angezeigt werden.

Hier als Beispiel. Ich habe diese Tabelle:

Kunden1.PNG

Hier sieht man, dass der Kunden 'Firma A' 2 unterschiedliche Adressen hat (Musterstrasse 12 und Musterweg 5).
Es sollen nur die Datensätze rausfliegen bei denen die Adressen (Strasse, PLZ und ORT) identisch sind.

Das Ergebnis nach der SELECT Anweisung sollte dann so aussehen:

Ergebnis1.PNG

Kunden 'Firma A' kommt 2 mal vor. Ist aber korrekt, da unterschiedliche Adressen.
 
Meine Frage war ob die Daten (vermutete Dubletten) ungesehen gelöscht werden sollen (durch DELETE) so das bei einem Select auf die Tabelle nur noch ein Datensatz pro Kunde übrig bleibt. Das würde ich nicht empfehlen sondern ich würde doppelte Datensätze manuell sichten und dann einzelne löschen. Siehe dazu die Abfrage mit meinem Code aus #2.

So wie du es schreibst klingt das so als wolltest du mit einem Select zukünftig Dubletten ausblenden aber dann mit den verbliebenen Daten weiterhin "arbeiten" wollen, das wird natürlich zu purem Chaos führen.

Deine neue Einschränkung zeigt, das das Thema keineswegs trivial ist. Um deine Beispieldaten zu bereinigen genügt natürlich die PLZ als weiteres Kriterium aber es kann ja auch zwei valide Adressen im selben Ort geben und dann wird es schnell sehr ungenau. Erweiterst du um Straße werden Schreibweisen relevant, usw.

Hier ein Select der aus deinen Beispieldaten dein Wunschergebnis macht:
Code:
WITH t AS (
SELECT ROW_NUMBER() OVER (PARTITION BY KDNR,PLZ ORDER BY Strasse) AS zeile,*
FROM tabelle )
SELECT * FROM t WHERE zeile = 1
 
Werbung:
Danke für deinen Lösungsvorschlag.

Ich habe es oben ein wenig ungeschickt formuliert. Ich will die Dubletten nur ausblenden, nicht aus der Tabelle löschen. Nach der SELECT Anweisung will ich also die Datensätze ohne die Dubletten sehen.

Ich hatte das auch schon mit einem Self Join gelöst:

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 and a.Strasse = b.Strasse)
GROUP BY a.KDNR, a.Strasse, a.PLZ, a.ORT, b.Kunde

Allerdings hat das Ausführen der Abfrage eine gefühlte Ewigkeit gedauert. Meine richtige Datenbanktabelle enthält natürlich deutlich mehr Datensätze und Spalten als die Beispiel-Tabelle hier.

Schlussendlich habe ich diesen einfachen Vorschlag bekommen, den ich jetzt auch benutze:

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

Vielen Dank für deine Hilfe
 
Zurück
Oben