none
Datensätze zusammenführen mit unterschiedlicher ID und Querverbindung von Feldnamen RRS feed

  • 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
    Montag, 11. Januar 2021 17:10

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

    Mittwoch, 13. Januar 2021 11:13

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



    Montag, 11. Januar 2021 17:43
    Moderator
  • 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


    Montag, 11. Januar 2021 20:19
  • 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

    Mittwoch, 13. Januar 2021 11:13
  • 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%.

    Mittwoch, 13. Januar 2021 20:10
  • Da hast Du vollkommen Recht. Man könnte auch das Ergebnis vom Wochentag abhängig machen! :-)

    Einen schönen Tag noch, Christoph - http://www.insidesql.org/blogs/cmu

    Donnerstag, 14. Januar 2021 07:56
  • Hallo miteinander


    Vielen Dank für eure Bemühungen!
    Mit diesen Lösungen kann ich arbeiten.

    Gruss und Dank
    Philippe

    Mittwoch, 27. Januar 2021 17:18