2016-03-21 14 views
-1

Das mag sehr einfach erscheinen, aber ich kann es nicht herausfinden. Ich habe ein Feld, das Datentyp bigint ist, und ich versuche, es mit einem anderen Feld zu multiplizieren, das Dezimal (9,5) ist, aber ich bekomme nur Null in all meinen Berechnungen. Ich habe versucht, die Bigint als Dezimalzahl zu werfen und es funktioniert auch nicht. Was vermisse ich?SQL Bigint * Dezimal

Ich benutze SQL Server 2000 glaube ich. Ich verweise auf die Nummer aus zwei verschiedenen Tabellen, die auf einem gemeinsamen Feld stehen.

((cast([costs] as decimal(9,5)) * cast([Ratio] as decimal(9,5))) as [Cost Ratio] 

ich auch hinzugefügt isnull (Verhältnis, 0) und nun füllt sie meine NULL-Werte mit 0,00000 aber immer noch nicht den multiplizierten Wert in dem Feld für [Kostenquote].

enter image description here

+1

Welche RDBMS verwenden Sie? – Jeroen

+0

Auch ein [MCVE] könnte helfen. Wenn ich MSSQL 2014 annehme und [probiere SELECT CAST (3 AS BIGINT) * CAST (2.5 AS DECIMAL (9,5))] funktioniert es wie erwartet] (http://sqlfiddle.com/#!6/9eecb7/6614/0). – Jeroen

+0

Es wäre schön, wenn Sie die Formel, die Sie verwenden, und wie Sie die Werte umsetzen. – Kamamba

Antwort

2

sollten Sie arithmetische Ausnahmen bekommen, nicht ein Nullwert. Sie werfen Ihre BigInt-Werte auf decimal(9,5) mit der Genauigkeit = 9 Skalierung = 5, die nur 4 Ziffern auf der linken Seite der Dezimalstelle übrig lässt. Alle Ihre Werte in Ihrer BigInt Spalte sind mindestens 6 Ziffern oder größer. Dies bedeutet, dass nicht genug Platz in der decimal(9,5) ist, um diesen großen int-Wert zu speichern. Versuchen Sie decimal(18,5), die viel Platz auf der linken Seite der Dezimalstelle für Ihre Typen in Ihrer Abfrage lässt.

Vergessen Sie auch nicht ISNULL (wo der Wert in den Daten Null sein) und erwartet, dass, wenn es null ist, dann werden Sie 0.

((cast([ISNULL(costs,0)] as decimal(18,5)) * cast([ISNULL(Ratio,0)] as decimal(18,5))) as [Cost Ratio] 

auch ein Ergebnis erhalten, wenn Ihre Ratio Spalt Typ ist bereits ein decimal(9,5) dann konvertieren Sie es nicht noch einmal, fügen Sie die ISNULL überprüfen, obwohl es eine Nullable-Spalte ist.

Weitere Informationen zum SQL Server-Dezimaltyp finden Sie unter: Sql Server Decimals. Der Grund, warum ich 18 als Präzision gewählt habe, ist der Speicher.

+0

Also habe ich das versucht etwas geändert, jetzt bekomme ich alle 0,000000000 in meiner Ergebnisspalte. Bedeutet das, dass SQL eines meiner Felder für null hält? –

+0

Nun, '0 * jeder Wert' ist immer 0 mit der Ausnahme, dass irgendein Wert' NULL' ist. – Igor

+0

Wenn Sie nicht sicher sind, um welche Spalte es sich handelt, ändern Sie die Auswahl, indem Sie sie aufteilen, um es herauszufinden. '((cast ([ISNULL (costs, 0)] als Dezimalzahl (18,5)) AS LeftSide, cast ([ISNULL (Ratio, 0)] als Dezimalzahl (18,5))) AS RightSide' – Igor