这个SQL Server查询分区计算有什么问题?

时间:2012-06-20 03:34:34

标签: sql sql-server sql-server-2008

我在SQL Server 2008 R2数据库上有这个表结构:

  CREATE TABLE FormTest
(   
clientid char(10),
DateSelected date,
A int,
B int,
C int
)

我在表格FormTest中填写了以下信息

clientid        DateSelected      A       B     C
x1              2006-06-09     65150    4921    1
x2              2006-05-05     155926   69092   1
x3              2006-01-20     95603    156892  1
x4              2006-01-20     30704    164741  1
x4              2006-02-03     65150    174834  1
x5              2006-04-28     59629    4921    1
x6              2006-01-27     30704    162356  1
x7              2006-06-30     65150    4921    1
x8              2006-07-10     65150    4921    1

最后,我运行这个SQL查询:

SELECT clientid, (((a+ b + c) / 3) / 216647 * 10) AS Formula1 
    From FormTest

但后来我得到了这些结果:

clientid        Formula1      
x1              0
x2              0
x3              0
x4              0
x4              0
x5              0
x6              0
x7              0
x8              0

有谁可以告诉我,我做错了什么?

4 个答案:

答案 0 :(得分:4)

这是因为你正在进行整数除法。你应该将其中一个操作数转换为float或decimal(取决于你正在进行的计算的精度和目的),使用类似的东西:

((CAST((a+ b + c) AS FLOAT) / 3) / 216647 * 10)

或可能:

(((a+ b + c) / 3.0) / 216647.0 * 10)

答案 1 :(得分:2)

您正在执行整数运算,因此您的结果将始终向下舍入到最接近的整数。由于您除以3,然后除以216647,根据数字输入,您的结果每次都会向下舍入为0。如果要获得非整数结果,则需要使用十进制(精确)或浮点(近似)数据类型和/或转换。

答案 2 :(得分:0)

declare @a int
declare @b int
declare @c int
set @a=65150
set @b=4921
set @c=1

select convert(float,((@a+@b+@c)/ 216647.0 * 10) )

答案 3 :(得分:0)

除以整数将产生一个整数(其余部分将被忽略)。因此,在分割时,使用小数或浮点数。 这应该适用于前面给出的浮点解决方案。用您的首选精度替换(12,2):

SELECT clientid, (((
Cast(a as decimal(12,2)) + 
Cast(b as decimal(12,2)) + 
Cast(c as decimal(12,2)) 
) / 3) / 216647 * 10) AS Formula1 
FROM FormTest