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

VARCHAR to FLOATSELECT CAST([Column 21] AS FLOAT) FROM [dbo].[z200_USER]

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von Mutohman, 10 Oktober 2020.

  1. Mutohman

    Mutohman Benutzer

    Hallo zusammen,
    ich habe in meiner Tabelle eine Spalte (VARCHAR) in der Werte wie zB. (-00000005.00, -00000002.37, 00000000.00, 00000001.37, etc.) eingetragen sind. diese Werte liegen da als STRING vor.
    Da es sich dabei um Geldbeträge handelt, hätte ich diese Werte, diese Spalte, zu DEZIMAL umgewandelt.
    Meine Versuche Scheitern!?
    >>> SELECT CAST([Column 21] AS decimal) FROM [dbo].[z200_USER]
    Msg 8114, Level 16, State 5, Line 20
    Error converting data type varchar to numeric.


    >>> SELECT CONVERT(decimal, [Column 21]) FROM [dbo].[z200_USER]
    Msg 8114, Level 16, State 5, Line 22
    Error converting data type varchar to numeric.

    >>>ALTER TABLE [dbo].[z200_USER]
    >>>ALTER COLUMN [Column 21] DECIMAL
    Msg 8114, Level 16, State 5, Line 28
    Error converting data type varchar to numeric.
    The statement has been terminated.


    Hat von euch jemand eine Ahnung was ich da falsch mache??
    Ich hätte die weerte soooo gerne als DECIMAL …
    LG
    mutohman
     
  2. akretschmer

    akretschmer Datenbank-Guru

    works for me:

    Code:
    test=*# \d mutohman
                Table "public.mutohman"
     Column | Type | Collation | Nullable | Default
    --------+------+-----------+----------+---------
     zahl   | text |           |          |
    
    test=*# select * from mutohman ;
         zahl     
    ---------------
     -00000005.00
      -00000002.37
     00000000.00
     00000001.37
    (4 rows)
    
    test=*# select sum(zahl::decimal) from mutohman ;
      sum  
    -------
     -6.00
    (1 row)
    
    test=*#
    
    Ist aber PostgreSQL, kein M$SQL.
     
  3. Mutohman

    Mutohman Benutzer

    THX...
    YAP … ich arbeite auf einem M$SQL
    ich habe die Spalte in TEXT Konvertiert

    >>> ALTER TABLE [dbo].[z200_USER]
    >>> ALTER COLUMN [Column 21] text

    Ist gelaufen!

    Auch da, Spalte in TEXT, bekomme ich die gleichen Fehlermeldungen:
    Msg 529, Level 16, State 2, Line 41
    Explicit conversion from data type text to decimal is not allowed.

    aber Danke für die Hilfe :)
    LG
    mutohman
     
  4. Tommi

    Tommi Datenbank-Guru

    Hallo mutohman,

    vermutlich sind in der String-Spalte noch Werte versteckt, in denen als Dezimaltrennzeichen ein Komma statt einem Punkt verwendet wird.
    Möglich sind natürlich auch andere alphanumerische Werte. Das kannst du rausfinden, indem du das folgende SQL-Statement ausführst:

    Code:
    SELECT *
    FROM [dbo].[z200_USER]
    WHERE ISNUMERIC(REPLACE([Column 21], ',', 'x')) != 1
    Eine sichere Konvertierung der Spalte kannst du dann wie folgt vornehmen, wobei Werte, die nicht konvertiert werden, einfach als NULL zurückgegeben werden:

    Code:
    SELECT (CASE WHEN ISNUMERIC([Column 21]) = 1 THEN CONVERT(decimal(18,2), REPLACE([Column 21], ',', '.')) ELSE NULL END) as [Column 21]
    FROM [dbo].[z200_USER]
    Bei der Konvertierung in [decimal] musst du beim SQL Server auch die Anzahl der Nachkommastellen angeben, sonst werden die abgeschnitten!
    Deshalb habe ich für den CONVERT 2 Nachkommastellen angegeben, Wenn du mehr benötigst, musst du diesen Wert entsprechend erhöhen.
    Im Übrigen kann der SQL Server aber auch das Datenformat [money], das grundsätzlich zwei Nachkommastellen hat.

    Viele Grüße,
    Tommi
     
    Walter gefällt das.
  5. Mutohman

    Mutohman Benutzer

    Hi,
    ja Du hast recht … habe ich schon am Samstag in der Nacht gefunden
    beim Befüllen der DB hat sich eine Spalte vereinzelt nach Rechts Verschoben
    Da wurde in der Eingabemaske bei Namen ein ; verwendet zB. (;Hr. Müller; Zahnarzt; anstelle von ;Hr. Müller Zahnarzt; )
    und dadurch springt mir der Import an diesen Zeilen um eins nach rechts … ergibt Fehler in [Column 22]

    SRY bin Anfänger … gibt es eine Möglichkeit das auch in der DB über SQL zu beheben oder ist er besser die Quellen zu reparieren.

    Danke für eure Hilfe
    LG
    mutohman
     
  6. akretschmer

    akretschmer Datenbank-Guru

    Du solltest das in der DB reparieren. Numerische Werte speichert man nicht als Text.
     
  7. Mutohman

    Mutohman Benutzer

    Hallo zusammen,
    VIELEN DANK für eure Hilfe !!! Ihr habt mir echt weitergeholfen.
    Ja das muss in der DB behoben werden und die Werte müssen auch den richtigen Daten Typ bekommen. Allerdings muss
    ich die Daten, wegen dem Format, überhaupt in die DB bekommen … Liegt am Flat File Format
    Beispiel:
    >>100;001145247749;E;20201009;31140059200732 ; ;202009;000000;20200901;20200930;;kunde@test.net;EUR;C;34
    >>110;Lieferant AT; Musterstraße 9 ;Musterstadt ;1090 ;AT;9671629;00000060000;AT716000000007501629;BAWBAWBAW ;UID;ATU 12345905;keine vorhanden;50011782 ;business@lieferant.net;0800 36 36 36
    >>130;31180055550732 ;Kunde/2 DD M.S. ;ATU12457812 ;Kundengasse 7 ;Kunde IV/2 Fr. Hofer Fr. Lustig ;Musterstadt;1010 ;AT;B;000000000000000000000;00000000000;; ; ;UID;ATU12457812 ; ; ;keine vorhanden;;
    >>150;066521412141;NETWORK XXG;90500000
    >>200;00001;066521412141;Max Enduser;;509000;G;M;50% Rabatt auf DD Business;;;;;;;;;;;;20,00;-00000000005,00;;
    >>200;00002;066521412141;Max Enduser;;509000;M;;NETWORK XXG;;;;;;20201001;20201031;;;;;20,00;00000000005,00;;
    >>200;00003;066521412141;Max Enduser;;509000;M;;DD Business 1000 (2008);;;;;;20201001;20201031;;;;;20,00;00000000000,00;;
    >>200;00004;066521412141;Max Enduser;;509000;M;;DD Business ;;;;;;20201001;20201031;;;;;20,00;00000000010,00;;
    >>200;00005;066521412141;Max Enduser;NETWORK XXG;509000;V;;Verbindungsentgelt;23201;Liferant AG;Light;NETWORK OnNet;Frei;20200922;20200922;000001;00000:05:30;;;20,00;00000000000,00;R;
    >>200;00006;066521412141;Max Enduser;NETWORK XXG;509000;V;;Verbindungsentgelt;23201;Liferant AG;Copper;Datenvolumen;Frei;20200901;20200930;000214;;000402707,64;TL;20,00;00000000000,00;R;
    >>300;066521412141;NETWORK XXG;509030; 00000000010,00; 00000000000,00; 00000000000,00; 00000000000,00; 00000000000,00
    >>150 ………..
    >>200 …..bla
    >>200 … bla
    >>300 … bla

    ……... keine Ahnung wie man diese Format nennt (kommt aus SAP denke ich), ach ja die ganzen Leerzeichen habe ich herausgelöscht.
    Und erst wenn ich alles in einer DB habe, teile ich sie, nach den Zeilennummern, in verschiedene DB auf und richte dann dort die Daten Typen ein.
    Und in den Zeilen 200, in der Spalte mit "Max Mustermann" werden von den Mitarbeitern die Kundennamen teilweise mit Semikolon eingegeben (zB.: "Dr; Max; Enduser" oder "Fr. Mayer; Dach") <- das ist mein Problem momentan

    Also … ich denk ich komme noch mit so einigen Fragen daher …
    LG
    mutohman
     
  8. Mutohman

    Mutohman Benutzer

    Hallo zusammen,
    noch eine Frage: ich habe eine Spalte "Start_Date", in dieser Spalte stand das Datum in der Form (20200627 / YYYYMMDD) als VARCHAR.
    Es waren aber nicht alle Zeilen in dieser Spalte gefüllt, mache waren leer.
    Spalte Umgewandelt mit:
    >> ALTER TABLE [dbo].[z200]
    >> ALTER COLUMN [Start_Date] date
    Über all wo ein Datum eingetragen war ist jetzt das Datum in richtiger Form 2020-06-27 … super
    Allerdings wurde mir in allen leeren Zellen das Datum 1900-01-01 eingetragen

    Wie kann ich, oder kann ich überhaupt die Zellen wieder von dem Eintrag 1900-01-01 befreien??????

    Danke für eure Hilfe
    mutohman
     
  9. dabadepdu

    dabadepdu Datenbank-Guru

    Code:
    Update z200
       set Start_date=NULL
     where Start_date = CONVERT(datetime, '01/01/1900', 103)
    
     
  10. Mutohman

    Mutohman Benutzer

    Vielen Dank dabadepdu

    hat gleich geklappt … Danke!!!

    >>Update [dbo].[z200]
    >>SET [Start_Date] = NULL
    >>WHERE [Start_Date] = CONVERT(datetime, '01/01/1900', 103)


     
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