我正在使用Sql Server 2008
假设您有一个名为“Weights”的表,并且在该表中有一个名为“Weight”的列,其数据类型定义为“real”,并带有以下数据。
重量(实际数据类型)
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
答案 0 :(得分:1)
这显然是数据中数字表示的问题。您看到的2.001必须真正存储为2.00099999999999。 。 。一些“9”。
我认为您最好的解决方案是将数据类型更改为DECIMAL(12,6),您所看到的就是您所获得的。
或者,您可以通过在值中添加一个非常小的增量来进行模糊数学运算:
select FLOOR(Weight * @INPUTconversion + 0.0000001)*@INPUTinterval as [Weight]
这会将真正接近2.001的体重视为2.001,而不仅仅是减少smidgen。