alwin2000
Goto Top

Duplizieren von Datensätzen aufgrund Mehrfachangaben in einer Spalte

In einer Tabelle habe ich x Spalten. In einer dieser Spalten stehen Zahlenwerte getrennt z.B. mit Semikolon.

Spalte 1, Spalte 2, Spalte 3, Spalte 4
Erwin, Meier, München, 24;86;50;12
Elli, Müller, Dortmund, 60
Fritz, Weber, Stralsund,38;10

Für die weitere temporäre wiederkehrende Weiterverarbeitung der Daten soll eine Tabelle wie folgt entstehen:

Spalte 1, Spalte 2, Spalte 3, Spalte 4
Erwin, Meier, München, 24
Erwin, Meier, München, 86
Erwin, Meier, München, 50
Erwin, Meier, München, 12
Elli, Müller, Dortmund, 60
Fritz, Weber, Stralsund, 38
Fritz, Weber, Stralsund, 10

Gibt es hierfür eine einfache Möglichkeit die man in eine Query einbauen könnte ohne das man über eine Prozedur mit Schleifen geht ?

Das ganze soll auf einen MS SQL-Server laufen (T-SQL)

Content-Key: 62814579661

Url: https://administrator.de/contentid/62814579661

Printed on: April 27, 2024 at 11:04 o'clock

Mitglied: 7907292512
7907292512 Oct 17, 2023 updated at 16:14:52 (UTC)
Goto Top
Guckst du
Turning a Comma Separated string into individual rows

Ab SQL-Server 2016 as simple as:
SELECT 
    Spalte1,Spalte2,Spalte3,cs.Value AS Spalte4
FROM 
    DEINE_TABELLE
CROSS APPLY
    STRING_SPLIT(Spalte4,';') AS cs;  

screenshot

Sollte die Spalte mit den zu splittenden Werten NULL Werte haben, dann statt CROSS APPLY ein OUTER APPLY nehmen.

gruß sid
Member: Alwin2000
Alwin2000 Oct 17, 2023 at 18:33:25 (UTC)
Goto Top
Hallo !

Zuerst mal vielen Dank.

Nach der Analyse der Daten ist mir noch etwas aufgefallen das das ganze noch mal komplizierter macht. Die Tabelle sieht so aus:

Spalte 1, Spalte 2, Spalte 3, Spalte 4
Erwin, Meier, München, 24;86|50;12
Elli, Müller, Dortmund, 60
Fritz, Weber, Stralsund,38;10

Ich habe als 2 Trennzeichen oder auch Gruppen. Um die "Gruppierung" hernach noch zu sehen habe ich mir folgendes Resultat gedacht

Spalte 1, Spalte 2, Spalte 3, Spalte 4
Erwin, Meier, München, A, 24
Erwin, Meier, München, A, 86
Erwin, Meier, München, B, 50
Erwin, Meier, München, B, 12
Elli, Müller, Dortmund, ,60
Fritz, Weber, Stralsund, ,38
Fritz, Weber, Stralsund, ,10

Dafür hatte ich mir gedacht, das

SELECT
Spalte1,Spalte2,Spalte3,cs.Value AS Spalte4
FROM
DEINE_TABELLE
CROSS APPLY
STRING_SPLIT(Spalte4,';') AS cs;

Dann sagt er mir aber das er einen Fehler in der Nähe von CROSS hat. Und wie macht man so Buchstaben rein ? Das wird ganz schön komplex.
Mitglied: 7907292512
Solution 7907292512 Oct 18, 2023 updated at 08:32:51 (UTC)
Goto Top
Nur so am Rande, dir fehlt erstens eine Spalte für die Gruppe in deiner Beschreibung face-wink, zweitens kann man es hier über eine Subquery machen:

Habe hier meine obige Beispieltabelle dafür herangezogen für die Gruppe habe ich hier eine fortlaufende Zahl statt einem Buchstaben benutzt, das beschränkt die ganze Sache nicht nur auf 26 Gruppen wie bei einem einzelnen Buchstaben:

screenshot

Es wird also im inneren Select erst mal nach '|' gesplittet, und danach im äußeren Select nach ';'. Die Gruppe wird dann durch die Ordinal-Spalte die die Funktion STRING_SPLIT zusammen mit der Value-Spalte zurückgibt wenn der dritte Parameter eine 1 ist, als Gruppenbezeichner genutzt. Man muss die Query von innen nach Außen lesen dann wird es verständlich wie hier vorgegangen wird.

Das wird ganz schön komplex.
Nicht wirklich, das ist noch harmlos face-smile.

Wenns das dann war, bitte
How can I mark a post as solved?
nicht vergessen!

Gruß sid.
Member: Alwin2000
Solution Alwin2000 Oct 18, 2023 at 11:57:36 (UTC)
Goto Top
Hallo !

Vielen Dank. Ich hatte übersehen das er bei der subQuery noch das "as ..." braucht.
Was zu erwähnen wäre, das mit dem ordinal funktioniert nur auch dem aktuellen SQL-Server.
Alternative:

SELECT
  Vorname,Nachnme,Gruppe,cs.value AS Probe
FROM
  (SELECT
	Vorname,Nachnme,
	ROW_NUMBER() OVER (PARTITION BY ID ORDER BY ID) as Gruppe,
	gs.value AS Proben
  FROM
     dbo.Kunden
  CROSS APPLY
	STRING_SPLIT(Proben,'|') AS gs  
  ) AS groups
CROSS APPLY
    STRING_SPLIT(Proben,';') AS cs  

ROW_NUMBER() OVER (PARTITION BY ID ORDER BY ID) as Gruppe bringt das gleiche Ergebnis wie gs.ordinal