我使用StackExchange数据资源管理器计算未解决的Java问题的平均答案数并得到一个接受的答案:
DECLARE @tagId int;
SELECT @tagId = Id
FROM Tags
WHERE TagName = 'java';
SELECT CAST(AVG(AnswerCount) as DECIMAL(5,2))
FROM posts p
JOIN PostTags pt ON pt.PostId = p.Id
WHERE pt.TagId = @tagId
AND p.PostTypeID = 1
AND p.AcceptedAnswerID IS NOT NULL
AND p.ClosedDate IS NULL;
但是,我总是得到2,所以我尝试将结果转换为小数。我还尝试先施放每个结果,然后再次施放平均值,但仍然,我得到2结果而不是2.29 ......
我的错误是什么?
答案 0 :(得分:4)
尝试在AVG语句中移动CAST,如下所示:
SELECT AVG(CAST(AnswerCount as DECIMAL(5,2)))
FROM posts p
join PostTags pt
on pt.PostId = p.Id
WHERE pt.TagId = @tagId
AND p.PostTypeID = 1
AND p.AcceptedAnswerID IS NOT NULL
AND p.ClosedDate IS NULL;
答案 1 :(得分:1)
avg
返回与收到的数据类型相同的数据类型。因此,计算avg
上的int
将返回int
(在您的情况下为2)。之后进行的任何加宽演员都没有意义,因为精度已经失去。解决此问题的一种方法是将列投射到decimal
,然后再将其投放到avg
函数:
SELECT AVG(CAST(AnswerCount) as DECIMAL(5,2))
FROM posts p
JOIN PostTags pt ON pt.PostId = p.Id
WHERE pt.TagId = @tagId
AND p.PostTypeID = 1
AND p.AcceptedAnswerID IS NOT NULL
AND p.ClosedDate IS NULL;