highmoe
Goto Top

MSSQL Datenkonvertierung 1 Zeile auf mehrere Zeilen - bitte um Tips

Hallo zusammen,

ich bräuchte mal Hilfe bei einer Datenübernahme in ein neues Format.

Aus historischen Gründen gibt es eine Tabelle mit einem Primärschlüssel über 3 Felder (Kunden-ID-, Lieferanten-ID, Jahr) in welcher in jedem Datensatz in einzelnen Feldern 12 Monatswerte (Umsatz in Währung) stehen. Ist nicht so toll auszuwerten, daher habe ich jetzt ein neues Format auf monatlicher Basis erarbeitet, bei dem der Primärschlüssel um Feld 4 (Monat) erweitert wird und jeweils nur der Monatsumsatz geschrieben wird. Zuätzlich werden noch weitere Felder übernommen bzw. neu dazugefügt, aber das ist nicht das eigentliche Thema.

Nun müssen rund 300.00 bestehende Datensätze übernommen werden.
Prinzipiell sollte das doch mit einr Art FOR-Schleife gemacht werden, oder? Die 12 Umsatzfelder einzeln durchgehen und jeweils einen neuen Datensatz schreiben - prinzipiell.
Habe ich in Transact-SQL noch nie gemacht - und um ehrlich zu sein, weiß ich noch nicht mal, wie ich das suchmaschinentechnisch in Deutsch und erst recht nicht in Englisch formulieren soll.

Gibt es Tips oder Links zu sowas?

Danke im Voraus,

Haimo

Content-Key: 332456

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

Printed on: April 19, 2024 at 18:04 o'clock

Member: SlainteMhath
Solution SlainteMhath Mar 17, 2017 at 11:15:42 (UTC)
Goto Top
Moin,

was du brauchst ist ein CURSOR: Eklärt z.b. hier
Und hier nochmal ein Beispiel dazu

Im Prinzip musst du

- per CURSOR die Records durchlaufen und jeweils
- pro Record 12x ein INSERT INTO in deinen neue Tabelle mit dem jeweiligen Montswert machen.

lg,
Slainte
Member: highmoe
highmoe Mar 17, 2017 at 11:36:09 (UTC)
Goto Top
Danke!

Ich denke, das ist genau der Tip, den ich gesucht habe.

Grundsätzliche Vorgehensweise war klar, aber die leckeren Details face-smile

LG, Haimo
Member: MadMax
MadMax Mar 17, 2017 at 11:54:47 (UTC)
Goto Top
Hallo Haimo und Slainte,

geht noch einfacher mit einem Befehl und union:
insert into <neue Tabelle> ([Kunden-ID], [Lieferanten-ID], Jahr, Monat, Umsatz, <andere Spalten>)
select [Kunden-ID], [Lieferanten-ID], Jahr, 1, Umsatz_01, <andere Spalten> from <alte Tabelle>
union
select [Kunden-ID], [Lieferanten-ID], Jahr, 2, Umsatz_02, <andere Spalten> from <alte Tabelle>
union
...
union
select [Kunden-ID], [Lieferanten-ID], Jahr, 12, Umsatz_12, <andere Spalten> from <alte Tabelle>

Deine Umsatzspalten habe habe ich mal als Umsatz_01 bis Umsatz_12 bezeichnet, die Monate werden statisch reingeschrieben.

Wenn Du sowas öfter verwenden wolltest, z.B. in einer Sicht, dann würde ich Dir empfehlen, in der Hilfe nach "unpivot" zu schauen, das ist schneller in der Abarbeitung und ist genau dafür gedacht.

Gruß, Mad Max
Member: ukulele-7
ukulele-7 Mar 17, 2017 at 13:05:48 (UTC)
Goto Top
Du brauchst weder eine FOR-Schleife noch einen CURSOR sondern kannst das total simpel machen:
INSERT INTO tabelle_neu(KundenID, Lieferanten-ID, Jahr,Monat,Umsatz)
SELECT KundenID, Lieferanten-ID, Jahr,'01' AS Monat,Umsatz_Januar AS Umsatz  
FROM tabelle_alt
UNION ALL
SELECT KundenID, Lieferanten-ID, Jahr,'02',Umsatz_Februar  
FROM tabelle_alt
UNION ALL
SELECT KundenID, Lieferanten-ID, Jahr,'03',Umsatz_Maerz  
FROM tabelle_alt
[...]
Schleifen sind echt nur eine Notlösung und verursachen meist mehr Probleme als sie lösen.