SQL Server case语句改变了值的准确性

时间:2014-01-27 19:54:26

标签: sql sql-server

我们有一个相当复杂的SQL Server 2008 r2 sp2查询,其中包含以下行之一: -

      SUM((t.Quantity * contract.ValueOfOnePoint) * ((
        CASE contract.Style
                WHEN 3
                    THEN 1 / (1.0 + ((100.0 - Val) / 100.0 * 90.0 / 365.0))
                WHEN 2
                    THEN 1000 * (6.0 * (1.0 - (POWER((1.0 / (1.0 + ((100.0 - Val) / 200.0))), 20.0))) / ((100.0 - Val) / 200.0) + (100.0 * (POWER((1.0 / (1.0 + ((100.0 - Val) / 200.0))), 20.0))))
                END
            ) - (
            CASE contract.Style
                WHEN 3
                    THEN 1.0 / (1.0 + ((100.0 - t.Price) / 100.0 * 90.0 / 365.0))
                WHEN 2
                    THEN 1000 * (6.0 * (1.0 - (POWER((1.0 / (1.0 + ((100.0 - t.Price) / 200.0))), 20.0))) / ((100.00 - t.Price) / 200.00) + (100.0 * (POWER((1.0 / (1.0 + ((100.0 - t.Price) / 200.0))), 20.0))))
                END
            )
        )) AS NativeAmount

我在一个样式为3的单行上对此进行测试,因此只有case语句中的第一行应该有任何影响,但是在其中留下“WHEN 2”子句会降低公式的准确性。

EG。如果我删除了两个WHEN 2条件我得到了一个答案,如123.45678但是剩下的WHEN 2行我得到了123.46。由于某种原因,它似乎是四舍五入的,即使第二个WHEN永远不应该在进行中。

任何想法都会非常感激 - 发疯了!

感谢。

詹姆斯。

1 个答案:

答案 0 :(得分:0)

你需要结合两件事。 case语句的返回类型对于所有thenelse子句都是相同的。这是documentation

的引用
  

[case case]返回类型集中的最高优先级类型   result_expressions和可选的else_result_expression。更多   信息,请参阅数据类型优先级(Transact-SQL)。

因此,SQL引擎 关心查询中的所有子句(这是您问题的答案)。

我不完全理解这种情况下发生的事情。当您调用power()函数时,编译器必须根据常量和列类型决定数值的精度。基于this SQL Fiddle,它选择38的精度和1的标度。然而,对值的简单算术产生36的精度和23的标度。我不知道为什么,最后,这会导致将值四舍五入到小数点后两位。也许为into子句分配类型的逻辑与表达式的输入逻辑不完全匹配。