0

SQLServer2008を使用しています

「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

4

1 に答える 1

1

これは明らかにデータの数値表現の問題です。2.001として表示されているものは、実際には2.0099999999999として保存する必要があります。。。いくつかの「9」の場合。

最善の解決策は、データ型をDECIMAL(12、6)のようなものに変更することだと思います。ここで、表示されるものが取得されるものです。

または、値に非常に小さな増分を追加することで、あいまいな計算を行うこともできます。

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

これにより、2.001に非常に近いウェイトが、単なるsmidgen未満ではなく、2.001として扱われます。

于 2012-10-03T17:41:38.303 に答える