2017-12-22 12 views
1

SQL Server上で動作しているクエリがありますが、パラメータを変更するとエラーが発生します。WHEREパラメータを変更するとエラーが発生する

"intをデータ型数値に変換する算術オーバーフローエラー 警告:Null値は、集計または他のSET操作によって排除されます。

以下のクエリは、その日が-7の場合に機能します。これを-90に変更すると、エラーが表示されます。 誰でも私にこれを訂正するために何が必要なのかを教えてもらえますか?

SELECT 
Category, 
Count(Category) AS TotalTasks, 
ISNULL(SUM(CASE WHEN impact > 0 then 1 end),0) AS TaskCompleted, 
    (SELECT ISNULL(CAST(SUM(CASE WHEN impact > 0 then 1 end)AS decimal(5,2))/CAST(Count(Category) AS decimal(5,2)),0)) AS Ratio 
FROM AppTasks 
WHERE TimeRaised > DATEADD(day, -7, GETDATE()) 
GROUP BY Category 

おかげ代わりにISNULLを使用しての

+1

TimeRaisedの列はどのデータ型ですか?それは万一の文字列であり、あなたが持っているはずの価値がありますか?または、おそらく他の列の 'ISNULL(SUM(CASE'などの部分?それは私が掘り出し始めるだろう。単にSELECTカテゴリ、影響を与えるAppTaskどこからTimeRaised> DATEADD(日、-7、getdate )、 '-90'で置き換えてください。同じエラーが発生した場合は、TimeRaisedカラムに問題があります。それ以外の場合は、' Category'カラムや 'Impact'カラムに不正な値が入っています –

+0

TimeRaisedはdatetime、ヌル。私は見て、TimeRaised列に無効なフィールドはありません。 – FuriousD

+0

'CAST()を適用している' Category'または 'Impact'カラムの値を確認してください。 –

答えて

1

CASEあなたはELSEでこれを扱うことができます。あなたのエラーは、COUNT(Category)またはSUM((CASE WHEN impact > 0 then 1 end))が999より大きい値を戻しているという事実から来ています。これをcast(... as decimal(5,2))としてキャストするときは、小数点の左側に3桁のスペースしか残さない精度2を指定しています。すなわち、最大値は999.99となる。

select cast(1000 as decimal(5,2)) 

私はあなただけで、結果として全体の数字を避けるために、整数除算対数値の除算を使用したいので、あなたがキャストされていると仮定します。したがって、1.0を掛けてすべてのキャストを削除するだけです。分子がまたはで分母が小数である必要があります。

(SELECT 
    SUM(CASE WHEN impact > 0 then 1 else 0 end) 
    /
    (Count(Category) * 1.0) 
) AS Ratio 
関連する問題