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

Mutohman

Benutzer
Beiträge
8
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
 
Werbung:
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.
 
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
 
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
 
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
 
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
 
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
 
Werbung:
Zurück
Oben