CAST在SQL查询中不起作用

时间:2014-05-05 14:39:12

标签: sql sql-server

我使用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 ......

我的错误是什么?

2 个答案:

答案 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;