2017-09-26 2 views
0

Ich bin sicher, jemand wird sofort erkennen, was für mich ist rätselhaft, also danke im Voraus. Ich habe eine Unterabfrage, die eine Gruppierung nach Name und PLZ-Feldern verwendet und nach Gruppen zählt> 1. Ich erhalte 528 Gruppen. Ich möchte die einzelnen vollständigen Datensätze sehen, also mache ich einen inneren Join zu diesem Ergebnis, das auf den Feldern Name und Postleitzahl festgelegt ist. Ich erwarte, dass mindestens 2 x 528 Datensätze als Minimum angezeigt werden, da jede Unterabfragezeile mindestens zwei Datensätze darstellt. Aber ich bekomme nur 190 Zeilen und kann den Fehler in meiner Logik nicht herausfinden.SQLGroup-by Unterabfrage

select m1.* 
from MasterList m1 
join 
(
    select FirstName, LastName, Zipcode, count(*) Cnt 
     from MasterList m2 
     group by FirstName, LastName,Zipcode 
     having count(*) > 1 
) x 
on m1.FirstName = x.FirstName and 
m1.LastName = x.LastName and 
m1.Zipcode = x.Zipcode 

Ich hoffe, das ist ausreichend Detail. Ich muss nicht verstehen, wie der Join funktioniert. Aber ich bekomme das gleiche Ergebnis, wenn ich Filterbedingungen anstelle von Join-Bedingungen verwende.

Thanks again, JimK

+0

'jede Unterabfragezeile repräsentiert mindestens zwei Datensätze' ist falsch. Für jede Zeile in 'm1' haben Sie 0 oder 1 Zeile in' x' –

+1

Geben Sie Beispieldaten, erwartetes Ergebnis und Erklärung von ihnen und kann jemand Ihnen helfen, Ihre Aufgabe zu lösen –

+0

Was ich meinte war das für jede Zeile in x, es sollte mindestens zwei Zeilen in m1 geben. – user3091705

Antwort

0

Haben Sie einen NULL Vornamen, Nachnamen oder zipcodes? Manchmal könnte es die Ergebnisse durcheinander bringen. Ohne Beispieldaten zu sehen, ich zu viel kann nicht wirklich helfen, aber versuchen, in Ihrer JOIN-Klausel wie folgt vorgehen:

on isnull(m1.FirstNamem, '') = isnull(x.FirstName, '') and 
isnull(m1.LastName, '') = isnull(x.LastName, '') and 
isnull(m1.Zipcode, '') = isnull(x.Zipcode, '') 
+0

https://technet.microsoft.com/en-us/library/ms190409(v=sql.105).aspx – NonProgrammer

+0

Ja, das war es. Vielen Dank. – user3091705

0

Sie haben wahrscheinlich NULL Werte in einem Feld. In jedem Fall sind Fensterfunktionen ein besserer Ansatz:

select m.* 
from (select m.*, count(*) over (partition by FirstName, LastName, Zipcode) as cnt 
     from MasterList m 
    ) m 
where cnt > 1; 
+0

Ja, das ist sicherlich eine elegantere Lösung. Wie ist es ein "besserer" Ansatz pragmatischer? – user3091705

+0

@ user3091705. . . Es ist davon abzuraten, mit einer Funktion zu kooperieren, da dies die Optimierung stark beeinträchtigen kann. Dies sollte schneller funktionieren, da SQL-Engines für Fensterfunktionen optimiert sind (die Fensterfunktion ersetzt sowohl einen 'Join' als auch einen' Group-By'). Plus, es funktioniert automatisch für 'NULL' Werte. –