0

我正在使用 Sql Server 2008

假设您有一个名为“Weights”的表,并且在该表中您有一个名为“Weight”的列,其数据类型定义为“真实”,并包含以下数据。

权重(真实数据类型)

2 2.001 2.002 2.003 2.004 2.005 2.006 2.007 2.008 2.009 3

这是我在新查询窗口中针对表运行的查询

declare @sql nvarchar(MAX)
declare @params nvarchar(MAX)
declare @interval float = .001
declare @conversion float = 1/@interval         

set @sql =
N'select FLOOR(Weight * @INPUTconversion)*@INPUTinterval as [Weight],
COUNT(1) as ''Count''
FROM dbo.Weights
GROUP BY FLOOR(Weight*@INPUTconversion)*@INPUTinterval
order by FLOOR(Weight*@INPUTconversion)*@INPUTinterval'

set @params =
N'
@INPUTconversion real,
@INPUTinterval float'

exec sp_executesql @sql, @params,  
@INPUTconversion = @conversion,
@INPUTinterval = @interval

这是似乎错误的结果。

重量计数

2 2 2.002 1 2.003 1 2.004 1 2.005 1 2.006 1 2.007 2 2.009 1 3 1

如何使用相同的查询使返回看起来像这样?我需要更改我的变量数据类型吗?

重量计数

2 1 2.001 1 2.002 1 2.003 1 2.004 1 2.005 1 2.006 1 2.007 1 2.008 1 2.009 1 3 1

4

1 回答 1

1

这显然是数据中数字表示的问题。您所看到的 2.001 必须真正存储为 2.00099999999999 。. . 对于一些“9”。

我认为您最好的解决方案是将数据类型更改为 DECIMAL(12, 6) 之类的类型,您所见即所得。

或者,您可以通过向值添加一个非常小的增量来做一些模糊数学:

select FLOOR(Weight * @INPUTconversion + 0.0000001)*@INPUTinterval as [Weight]

这会将真正接近 2.001 的权重视为 2.001,而不仅仅是少一点。

于 2012-10-03T17:41:38.303 回答