2010-12-06 8 views
0

varchar値を小数点に変換して合計するt-sql文があります。値が存在しない場合は0を返します。行データが存在しないときにvarcharを10進数に変換する方法

エラーは、「データ型varcharを数値に変換中にエラーが発生しました」です。結果データが返されない場合、のみがこの場合に発生します。データのないよう

select sum(convert(decimal(28,8), isnull(myColumn, 0))) 
from myTable 
//...multiple inner joins 
//...and multiple filter criteria 

は、私はすべての行が存在し、次のステートメントを実行するかどうかを検出するためにSELECT COUNTをしていたことを考えていた回避策が存在します。これにはもっと良い解決策がありますか?

答えて

2

は動作しません助けることができる願っています。 ifを行う以外のやり方を見つけることができませんでした。

これはずっと大きなSQLスクリプトの一部であり、この特定の部分は一時表を更新していました。

if exists(select * from table inner join...where...) 
being 
    select sum(convert(decimal(28,8), isnull(myColumn, 0))) 
    from myTable 
    ...inner joins 
    ...where clause 
end 

更新

それはerroringた理由実際の理由は、WHERE句が実行された場所の前に参加するには、理由はどこ変換が起こっていた句、およびerroringでした。内部結合はNULL値を戻していました。

+0

else statmentを追加して、最初の列として0を、2番目の列に0を選択して、すべての場合に結果セットを得ることができます。 – HLGEM

1

isnullの場所が間違っています。

sum(convert(decimal(28,8),isnull(myColumn,0))) 

ヌル値を0に変換してから10進数に変換し、最後に合計します。

+0

申し訳ありません私は頭の上からSQLを書いていて、間違って書いていました。エラーは、行が返されない場合にも発生します。 – David

+0

私は考え続けるでしょう – JamieDainton

0
sum(convert(decimal(28,8), isnull(myColumn,'0')) 
+0

- データが存在しないときには、まだ変換できません。 – David

+0

私はこの場合、その列にいくつかの無効な文字があり、結果データが返されないときに失敗した理由を考えます。区切り文字または無効な小数点文字を探している値を見てください。これは、一部のローカルでは他の '。'になる可能性があります。データが見つからない場合、select文は実行されないので、結果にはnullのみがあります。 –

0

は、念のために、いくつかは、COALESCEを好む:

sum(convert(decimal(28,8), COALESCE(myColumn,'0')) 
+0

正しくない - データが存在しない場合でも変換できません。 – David

+0

mytable_から_select *を実行し、最初の20行を表示できますか? – smirkingman

0

私はこのクエリはデータが存在しないときにすべての答え以下

select isnull(sum(convert(decimal(28,8),isnull(myColumn,0))), 0) 
from myTable 
関連する問題