sql >> データベース >  >> RDS >> Sqlserver

フロートの不整合の平均

    これは、次のように非常に似ています。 SELECT SUM(...) is non-deterministic when adding the column-values of datatype float

    問題は、データ型が不正確なことです(FLOAT/REAL )浮動小数点の算術演算の順序が重要です。接続からのデモ:

    DECLARE @fl FLOAT = 100000000000000000000
    DECLARE @i SMALLINT = 0
    WHILE (@i < 100)
    BEGIN
        SET @fl = @fl + CONVERT(float, 5000)
        SET @i = @i + 1
    END
    SET @fl = @fl - 100000000000000000000
    SELECT CONVERT(NVARCHAR(40), @fl, 2)
    -- 0.000000000000000e+000
    
    
    DECLARE @fl FLOAT = 0
    DECLARE @i SMALLINT = 0
    WHILE (@i < 100)
    BEGIN
        SET @fl = @fl + CONVERT(float, 5000)
        SET @i = @i + 1
    END
    SET @fl = @fl + 100000000000000000000
    SET @fl = @fl - 100000000000000000000
    SELECT @fl
    -- 507904
    

    LiveDemo

    考えられる解決策:

    • CAST DECIMAL/NUMERICなどの正確なデータ型に対するすべての引数
    • テーブルを変更し、FLOATを変更します DECIMAL
    • クエリオプティマイザに同じ順序で合計を計算させるように試みることができます。

    幸いなことに、安定したクエリ結果がアプリケーションにとって重要な場合は、 OPTION(MAXDOP 1)を使用して並列処理を防止することで、順序を同じにすることができます。 。

    最初のリンクが切れているようです。 WebArchive




    1. SPARSECOLUMNを使用する理由と時期(SQL SERVER 2008)

    2. SQLServer2000で行のセットを列として転置する

    3. 初心者のためのSQLリファレンス

    4. PHPでパスワードハッシュを復号化するにはどうすればよいですか?