2016-03-21 8 views
-1

これは非常に単純に思えるかもしれませんが、わかりません。私はbigintデータ型のフィールドを持って、私は10進数(9,5)の別のフィールドでそれを掛けようとしていますが、私はすべての計算でnullを返します。私は小数点としてBigintをキャストしようとしましたが、それも動作しません。私は何が欠けていますか?SQL Bigint * Decimal

私はSQL Server 2000を使用しています。私は共通のフィールドに結合された2つの異なるテーブルから番号を参照しています。

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

私はまた、ISNULL(比、0)を添加し、今では0.00000と私のnull値を移入しますが、それでも[原価率]のためのフィールドの乗算値を得ることはありません。

enter image description here

+1

どのRDBMSを使用していますか? – Jeroen

+0

また、[mcve]が役立つかもしれません。私がMSSQL 2014と仮定し、[SELECT CAST(3 AS BIGINT)* CAST(2.5 AS DECIMAL(9,5)) 'を期待どおりに動作させれば](http://sqlfiddle.com/#!6/9eecb7/6614/0)。 – Jeroen

+0

あなたが使用する数式と値をどのようにキャストするかは、あなたが入れておくといいでしょう。 – Kamamba

答えて

2

あなたは、算術例外ではなく、null値を取得する必要があります。 BigIntの値は、precision = 9 scale = 5のdecimal(9,5)にキャストします。これは、小数点の左側に4桁しか残しません。 BigInt列のすべての値は、6桁以上です。これは、その大きなint値を格納するのに十分な空き領域がないことを意味します(decimal(9,5))。クエリdecimal(18,5)を試してください。これは、クエリの型の小数点の左側に十分な余地を残します。

もISNULLを忘れて(値がデータにnullにすることができます)、それがnullの場合、あなたはRatio列場合も0

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

の結果を得ようとしていることを期待していません型はすでにdecimal(9,5)です。それを再度変換しないでください。ヌル可能な列であれば、ISNULLチェックを追加してください。

参照:SQLサーバーの小数点型の詳細は、Sql Server Decimalsを参照してください。私が精度を18と選んだ理由は、ストレージと関係があります。

+0

だから私はこれを何か変えました、今私は結果の列にすべて0.000000000を得ます。それはSQLが自分のフィールドの1つがnullだと思いますか? –

+0

まあ、「0 *任意の値」は常に0ですが、「NULL」の値は例外です。 – Igor

+0

どの列がわからない場合は、それらを分けることによって選択を変更してください。 AS LeftSide、cast([ISNULL(Ratio、0)]を10進数(18,5))AS RightSide' – Igor