josefsepp
Goto Top

SQL-Abfrage ändern bzw. umformulieren

Hallo zusammen,

wir haben in unserer Firma zwei voneinander getrennte Kundendatenbanken in eine umgewandelt. Nun haben wir eine gewisse Anzahl von Dubletten in dieser Datenbank und versuchen nun diese herauszufiltern. In der einen Datenbank beginnen die Kundennummern mit einer 17, in der anderen Datenbank beginnen die Kundennummern mit einer 19. Nachfolgend meine SQL-Abfrage:

select count (*) as doppelt, name1, plz, strasse

from kunden


where (kundnr LIKE '17%'
OR kundnr LIKE '19%')
AND Aktivflag = 1

having count (*) > 1


group by name1, plz, strasse
order by doppelt desc, name1


In dieser Abfrage werden dann alle Kunden herausgefiltert, welche den selben Namen, PLZ und Strasse haben. Wenn ich jedoch noch zusätzliche Informationen zu den Kunden haben möchte, müsste ich in der Select-Anweisung mehr Spalten hinterlegen, was wiederrum das Ausgabeergebnis verringert.

Das optimale Ergebnis sollte so sein:

Kunde PLZ Strasse Spalte1 Spalte2 Spalte3
Horst 94491 Weg 1 abc def ghi
Horst 94491 Weg 1 xyz ghi tzu
Horst 94491 Weg 1 jkl zui tzu
Xaver 94469 Ort 2 rts qwe asd
Xaver 94469 Ort 2 ert hjk sdf

Die-SQL-Abfrage soll alle mehrfach angelegten Kunden ausgeben, welche den gleichen Namen, PLZ und Strasse haben. Zusätzlich sollten noch beliebig viele Spalten angegeben werden können.

Datenbank: Oracle 10g (10.2.0.3)

Bin für jede Hilfe dankbar.

mfg

JosefSepp

Content-ID: 123446

Url: https://administrator.de/forum/sql-abfrage-aendern-bzw-umformulieren-123446.html

Ausgedruckt am: 25.12.2024 um 15:12 Uhr

Biber
Biber 25.08.2009 um 17:23:56 Uhr
Goto Top
Moin JosefSepp,

für Deine Anforderung brauchst du ja noch einen Join mehr:

SELECT k.* FROM Kunden k, 
(select count (*) as doppelt, name1, plz, strasse
from kunden
where (kundnr LIKE '17%'  
OR kundnr LIKE '19%')  
AND Aktivflag = 1
having count (*) > 1
group by name1, plz, strasse
) doppelkunde
WHERE
K.name1=doppelkunde.kunde AND
k.Plz=doppelkunde.plz AND
k.Strasse=doppelkunde.strasse
ORDER BY k.name1, K.plz, k.strasse, k.kundnr

[ungetestet]


Grüße
Biber

[Edit] Tippfehlerkorrektur: "name1" statt "kunde" und "strasse" statt "str" beim group by. [/Edit]
[Edit2] Jetzt noch mit dem überlesenen ORDER BY DoppelCOUNT:
SELECT doppelkunde.doppelt, k.* FROM Kunden k, 
(select count (*) as doppelt, name1, plz, strasse
from kunden
where (kundnr LIKE '17%'  
OR kundnr LIKE '19%')  
AND Aktivflag = 1
having count (*) > 1
group by name1, plz, strasse
) doppelkunde
WHERE
K.name1=doppelkunde.kunde AND
k.Plz=doppelkunde.plz AND
k.Strasse=doppelkunde.strasse
ORDER BY doppelkunde.doppelt, k.name1, K.plz, k.strasse, k.kundnr
[/Edit2]
filippg
filippg 25.08.2009 um 20:57:57 Uhr
Goto Top
Hallo,

dein Problem ist, dass du alle Spalten, die im SELECT stehe auch im GROUP haben musst? Und dann nur noch die Ausgegeben bekommst, die tatsächlich _alles_ gleich haben (auch die zusätzlichen Spalten, die du einfach informativ ausgeben willst)? Dann solltest du aus count(*) ein count(strasse) machen.

Gruß

Filipp
JosefSepp
JosefSepp 26.08.2009 um 07:59:07 Uhr
Goto Top
Danke für die beiden Antworten. Werde beide gleich ausprobieren.
JosefSepp
JosefSepp 26.08.2009 um 10:40:24 Uhr
Goto Top
Der Vorschlag von Biber war bis auf einen kleinen Fehler perfekt. (K.name1=doppelkunde.kunde). Danke.

Der Vorschlag von filippg lieferte mir leider keine Ergebnisse. Trotzdem vielen Dank für deinen Vorschlag.