我有一个关于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
由于
答案 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