我正在使用 Sql Server 2008
假设您有一个名为"权重"的表,在该表中有一个名为"权重"的列,其数据类型定义为"real",其中包含以下数据。
权重(实际数据类型)
阿拉伯数字2.0012.0022.0032.0042.0052.0062.0072.0082.0093
这是我在新查询窗口中针对表运行的查询
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
这是似乎错误的结果。
重量计数
222.002 12.003 12.004 12.005 12.006 12.007 22.009 13 1
如何使用相同的查询使返回看起来像这样?我需要更改变量数据类型吗?
重量计数
2 12.001 12.002 12.003 12.004 12.005 12.006 12.007 12.008 12.009 13 1
这显然是数据中的数字表示问题。 您看到的 2.001 必须真正存储为 2.00099999999999 . .对于一些"9"。
我认为您最好的解决方案是将数据类型更改为 DECIMAL(12, 6) 之类的内容,其中所见即所得。
或者,您可以通过向值添加非常小的增量来执行一些模糊数学运算:
select FLOOR(Weight * @INPUTconversion + 0.0000001)*@INPUTinterval as [Weight]
这会将真正接近 2.001 的权重视为 2.001,而不仅仅是少一点。