Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Zeile in Spalte ändern

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von Rambo21, 8 Mai 2014.

  1. Rambo21

    Rambo21 Aktiver Benutzer

    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
     
  2. ukulele

    ukulele Datenbank-Guru

    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: 9 Mai 2014
  3. Rambo21

    Rambo21 Aktiver Benutzer

    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!
     
  4. akretschmer

    akretschmer Datenbank-Guru

    So weit, so falsch.

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


    Ja. Normalisiere den Scheiß. So geht das gar nicht.
     
  5. ukulele

    ukulele Datenbank-Guru

    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.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden