更改WHERE参数时出错

时间:2017-12-22 11:33:51

标签: sql-server sql-server-2008

我有一个关于SQL Server的查询正在工作但是当我更改where参数时我收到错误。

“将int转换为数据类型numeric的算术溢出错误。 警告:聚合或其他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

由于

1 个答案:

答案 0 :(得分:1)

您可以使用ISNULL来处理此问题,而不是在CASE上使用ELSE。您的错误来自于COUNT(Category)SUM((CASE WHEN impact > 0 then 1 end))返回的值大于999这一事实。当您将其转换为cast(... as decimal(5,2))时,您指定的精度为2,只留下小数点左边3位数的空间。即最大值为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