SQL Server

时间:2016-01-31 12:23:03

标签: sql sql-server tsql floating-point case

我有这段代码,我正在尝试将[Dis][Estimator]进行比较,这是我要添加的变量:

SELECT 
    [Id],
    [Sym],
    [Month],
    [Dis],
    Estimator =  4/count(Id) over (partition by Sym, Month)
FROM 
    [RegularPayResultsYearly]

同样,我正在尝试将DisEstimator进行比较。

例如,count(Id) over (partition by Sym, [Month])是12091次观察。

问题:Dis列是float类型(示例值: 8.2944916060179E-06,9.07691249104339E-05)似乎

4/count(Id) over (partition by Sym, [Month])  as cnt 

这是3.308245802663138e-4不能超过零它显示我 估算器= 0.

有什么方法可以改变吗?

感谢。

2 个答案:

答案 0 :(得分:0)

不幸的是,您无法使用相等性来比较浮点时间 - 并且始终如一。你可以有两个解决方案。一种是取差值的绝对值,如果小于某个(任意)阈值则称之为0:

SELECT . . .,
       (CASE WHEN ABS(Dis) - 4/count(Id) over (partition by Sym, Month)) < 0.001
             THEN 'EQUAL'
             ELSE 'NOTEQUAL'
        END)
FROM RegularPayResultsYearly

第二种是使用decimal / numeric而不是float:

SELECT . . .,
       (CASE WHEN CAST(Dis, DECIMAL(10, 3)) =
                  CAST(4.0/count(Id) over (partition by Sym, Month) AS DCIMAL(10, 3) = 0
             THEN 'EQUAL'
             ELSE 'NOTEQUAL'
        END)
FROM RegularPayResultsYearly

请注意表达式4/COUNT(ID) OVER (PARTITiON BY Sym, Month)将返回一个整数(并且可能返回0)。当两个操作数都是整数时,SQL Server会进行整数除法。

答案 1 :(得分:0)

在下面的代码中,否则,如果我不想传递'NOTEQUAL'并传递浮点NULL值怎么办

    SELECT . . .,
       (CASE WHEN CAST(Dis, DECIMAL(10, 3)) =
                  CAST(4.0/count(Id) over (partition by Sym, Month) AS DCIMAL(10, 3) = 0
             THEN 'EQUAL'
             ELSE 'NOTEQUAL'
        END)
FROM RegularPayResultsYearly