Benutzer mit den meisten Antworten
Datensätze zusammenführen mit unterschiedlicher ID und Querverbindung von Feldnamen

Frage
-
Hi,
Ich habe eine Tabelle mit einem Inkrement ID, Feld1 als varchar und Feld 2 als varchar.
Die Daten:
1 Peter Müller
2 Müller Peter
3 Fritz Meier
4 Meier Fritz
Nun möchte ich gerne die Datensätze so erhalten:
1 2 Peter Müller
3 4 Fritz Meier
Geht das?
Mir zu kompliziert... ;-)
Gruss und Dank
Philippe
Antworten
-
Bestimmt nicht die idealste Lösung, aber ich gebe sie mal als Diskussionsansatz frei:
Create Table #Duplikate (ID int, Feld1 varchar(20), Feld2 varchar(20)); Insert into #Duplikate(ID, Feld1, Feld2) Values (1, 'Peter', 'Müller'), (2, 'Müller', 'Peter'), (3, 'Fritz', 'Meier'), (4, 'Meier', 'Fritz'), (5, 'Müller', 'Peter'), (6, 'Fritz', 'Meier'); With AllData as ( Select d1.ID, d1.Feld1, d1.Feld2, d2.Feld2 as Feld2_2, d2.Feld1 as Feld1_2 from #Duplikate d1 INNER JOIN #Duplikate d2 on d1.ID = d2.ID ) , MinimumData as ( Select min(a.ID) as MinId, d.Feld1, d.Feld2 from AllData a, #Duplikate d where (a.Feld1 = d.Feld1 and a.Feld2 = d.Feld2) or (a.Feld2_2 = d.Feld1 and a.Feld1_2 = d.Feld2) group by d.Feld1, d.Feld2 ) , FirstOccurence as ( Select min(d.ID) as ID, d.Feld1, d.Feld2 from MinimumData m inner join #Duplikate d on m.MinId = d.ID group by d.Feld1, d.Feld2 ) , Combination as ( Select a.ID, f.Feld1, f.Feld2 from AllData a Inner Join FirstOccurence f on (a.Feld1 = f.Feld1 and a.Feld2 = f.Feld2) or (a.Feld2_2 = f.Feld1 and a.Feld1_2 = f.Feld2) ) SELECT Distinct Feld1, Feld2, LEFT(MyCommaSeparatedList , LEN(MyCommaSeparatedList)-1) AS MyCommaSeparatedList FROM Combination c CROSS APPLY (SELECT CAST(ID AS NVARCHAR(10)) + ',' FROM Combination o WHERE o.Feld1 = c.Feld1 and o.Feld2 = c.Feld2 ORDER BY o.ID FOR XML PATH('')) AS x(MyCommaSeparatedList) order by Feld1, Feld2 ; go Drop Table #Duplikate;
HTH!
Einen schönen Tag noch, Christoph - http://www.insidesql.org/blogs/cmu
- Als Antwort vorgeschlagen Ivan DragovMicrosoft contingent staff, Moderator Dienstag, 19. Januar 2021 13:15
- Als Antwort markiert Ivan DragovMicrosoft contingent staff, Moderator Mittwoch, 27. Januar 2021 14:30
Alle Antworten
-
Hallo Philippe,
was soll passieren, wenn eine Kombination mehr als einmal vorkommt? Also bspw.:
1 Peter Müller 2 Müller Peter 3 Fritz Meier 4 Meier Fritz 5 Müller Peter 6 Fritz Meier
Reicht es auch in der Form?
Name Nachname IDs Peter Müller 1, 2 Fritz Meier 3, 4
?
Woran machst Du fest, welchen der Datensätze Du in der Ausgabe haben möchtest? Den mit der kleinsten ID? ...?
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport
- Bearbeitet Stefan FalzModerator Montag, 11. Januar 2021 17:46
-
Hallo Stefan,
Du hast die richtigen Fragen gestellt 😊
Ja, eine Kombination kann mehrfach vorkommen, also auch noch mehr als 3.
Also nach deiner Liste wäre das
Name Nachname IDs
Peter Müller 1,2,5
Fritz Meier 3,4,6
Diese Form macht Sinn.
Gruss und Dank
Philippe
-
Bestimmt nicht die idealste Lösung, aber ich gebe sie mal als Diskussionsansatz frei:
Create Table #Duplikate (ID int, Feld1 varchar(20), Feld2 varchar(20)); Insert into #Duplikate(ID, Feld1, Feld2) Values (1, 'Peter', 'Müller'), (2, 'Müller', 'Peter'), (3, 'Fritz', 'Meier'), (4, 'Meier', 'Fritz'), (5, 'Müller', 'Peter'), (6, 'Fritz', 'Meier'); With AllData as ( Select d1.ID, d1.Feld1, d1.Feld2, d2.Feld2 as Feld2_2, d2.Feld1 as Feld1_2 from #Duplikate d1 INNER JOIN #Duplikate d2 on d1.ID = d2.ID ) , MinimumData as ( Select min(a.ID) as MinId, d.Feld1, d.Feld2 from AllData a, #Duplikate d where (a.Feld1 = d.Feld1 and a.Feld2 = d.Feld2) or (a.Feld2_2 = d.Feld1 and a.Feld1_2 = d.Feld2) group by d.Feld1, d.Feld2 ) , FirstOccurence as ( Select min(d.ID) as ID, d.Feld1, d.Feld2 from MinimumData m inner join #Duplikate d on m.MinId = d.ID group by d.Feld1, d.Feld2 ) , Combination as ( Select a.ID, f.Feld1, f.Feld2 from AllData a Inner Join FirstOccurence f on (a.Feld1 = f.Feld1 and a.Feld2 = f.Feld2) or (a.Feld2_2 = f.Feld1 and a.Feld1_2 = f.Feld2) ) SELECT Distinct Feld1, Feld2, LEFT(MyCommaSeparatedList , LEN(MyCommaSeparatedList)-1) AS MyCommaSeparatedList FROM Combination c CROSS APPLY (SELECT CAST(ID AS NVARCHAR(10)) + ',' FROM Combination o WHERE o.Feld1 = c.Feld1 and o.Feld2 = c.Feld2 ORDER BY o.ID FOR XML PATH('')) AS x(MyCommaSeparatedList) order by Feld1, Feld2 ; go Drop Table #Duplikate;
HTH!
Einen schönen Tag noch, Christoph - http://www.insidesql.org/blogs/cmu
- Als Antwort vorgeschlagen Ivan DragovMicrosoft contingent staff, Moderator Dienstag, 19. Januar 2021 13:15
- Als Antwort markiert Ivan DragovMicrosoft contingent staff, Moderator Mittwoch, 27. Januar 2021 14:30
-
Generell gibt es das Problem, dass die Zusammenfassung vom 1. Auftreten einer Kombination abhängt, da SQL nicht zwischen Vor- und Nachnamen unterscheiden kann.
Wenn als Id 1 inhaltlich mit Id 2 vertauscht wird, erfolgt die Zusammenfassung nach "Müller Peter" statt nach "Peter Müller". Die Wahrscheinlichkeit bei 1000den von Paaren ist da schon hoch, dass die Quote diesbezüglich 50% betragen kann. Je nach Erfassungsgrad in beide Richtungen abweichend, also zwischen 0 - 100%.