Zeile in Spalte ändern

Rambo21

Aktiver Benutzer
Beiträge
37
Hallo,

ich stehe vor einem Problem, dass ich irgendwie nicht lösen kann.

Meine Bsp.tabelle:
Rolle | Screen1 | Screen2 | Screen3 | Screen4 | Screen5 | Screen6 | ... | Screen98
Acc. | 123 | 456 | 789 | 012 | 963 | 852 | ... | 753
IT | 456 | 012 | 555 -> IT hat nur 3 Screens
OP | 963 | 123 | 456 | 852 | 159

Zielanzeige:
Acc. | IT | OP
123 |456|963
456 |012|123
789 |555|456
012 | |852
963| |159
...
753

Noch eine Frage: Wie kann ich am Besten den Wert eines Feldes - 123,456,789,012,963,852,... - bei jedem Komme in Spalten trennen? Ich glaube, dass man hier eine Funktion schreiben muss, oder?

Danke und LG,
Ram
 
Werbung:
Dein Tabellendesign ist ungefähr das Schlechteste was man tun kann und dementsprechend wirst du leiden müssen, eigentlich kannst du die Zahlen auch gleich abtippen, das ist weniger Arbeit.
 
Zuletzt bearbeitet:
Hallo ukulele,

eigentlich hat die tabelle folgende Struktur
Role | Value
HoA | 49999,50350,50351,50354,60217,50400,50401,50450,50453,50470,50485,50486,50487,60000,60004,60002,60003,60009,60001,60005,60006,60007,60008,90006, ....
etc..
etc..

Mir sagt jetzt der Wert 49999 nichts aus.
Es gibt da eine Tabelle wo 49999, 50350, etc.. einen Namen eingetragen haben. Und mein Ziel ist es eine Tabelle zu erstellen, die wie folgt aussieht:

HoA
49999 - Account creation
50350 - Customer search
etc...

So weiß ich auf Anhieb, dass die Rolle HoA die jenigen Werte hat und die Werte heißen so.

Ich habe den Inhalt der Spalte Value (49999,50350,50351,50354,60217, etc...) mit Substring getrennt -> war eine höllische Rechenarbeit:
SUBSTRING(agr.Value, 1, 5) '1', SUBSTRING(agr.Value, 7, 5) '2', SUBSTRING(agr.Value, 13, 5) '3', etc...

Irgendwie muss es doch möglich sein, oder!
 
Hallo ukulele,

eigentlich hat die tabelle folgende Struktur
Role | Value
HoA | 49999,50350,50351,50354,60217,50400,50401,50450,50453,50470,50485,50486,50487,60000,60004,60002,60003,60009,60001,60005,60006,60007,60008,90006, ....
etc..
etc..

So weit, so falsch.

Mir sagt jetzt der Wert 49999 nichts aus.

Mir auch nicht. Mein Kontostand ist es jedenfalls (leider) nicht.

Es gibt da eine Tabelle wo 49999, 50350, etc.. einen Namen eingetragen haben. Und mein Ziel ist es eine Tabelle zu erstellen, die wie folgt aussieht:

HoA
49999 - Account creation
50350 - Customer search
etc...

So weiß ich auf Anhieb, dass die Rolle HoA die jenigen Werte hat und die Werte heißen so.

Ich habe den Inhalt der Spalte Value (49999,50350,50351,50354,60217, etc...) mit Substring getrennt -> war eine höllische Rechenarbeit:
SUBSTRING(agr.Value, 1, 5) '1', SUBSTRING(agr.Value, 7, 5) '2', SUBSTRING(agr.Value, 13, 5) '3', etc...

Irgendwie muss es doch möglich sein, oder!


Ja. Normalisiere den Scheiß. So geht das gar nicht.
 
Werbung:
Eigentich normalisiert er ja bereits. Aber hier erstmal eine wichtige Frage vorab: Willst du diesen Schritt einmalig machen, regelmäßig oder muss das sogar live passieren? Die Daten müssen bei der Normalisierung natürlich einmalig umgestellt werden, das ist machbar. Bei regelmäßiger Aufarbeitung wirds schwieriger und Live wird gar nicht lustig :)

Ich würde mir eine Schleife bauen, die sich jeden Datensatz aus der Quelltabelle nimmt, zerlegt, und in eine Zieltabelle schreibt. In etwa so:
Code:
DECLARE   @counter INT,
     @role VARCHAR(20),
     @value VARCHAR(5000),
     @value_new INT

SET     @counter = (   SELECT   count(*)
             FROM   quelltabelle )

WHILE   @counter > 0
BEGIN
   SELECT   TOP 1
       @role = [Role],
       @value = Value
   FROM   quelltabelle

   WHILE   @value LIKE '%,%'
   BEGIN
     SET     @value_new = cast(left(@value,charindex(',',@value)-1) AS INT)
     INSERT INTO zieltabelle([Role],Value) VALUES (@role,@value_new)
     SET     @value = right(@value,len(@value)-charindex(',',@value))
   END

   SET     @counter = @counter -1
END
Das ist aber noch nicht fertig, er nimmt ja immer den ersten Datensatz einer Tabelle. Primärschlüssel wäre gut. Auch weiss ich nicht, woher dein Text (Account creation, Customer search, etc.) kommen soll.
 
Zurück
Oben