我们有一个相当复杂的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永远不应该在进行中。
任何想法都会非常感激 - 发疯了!
感谢。
詹姆斯。
答案 0 :(得分:0)
你需要结合两件事。 case
语句的返回类型对于所有then
和else
子句都是相同的。这是documentation:
[case case]返回类型集中的最高优先级类型 result_expressions和可选的else_result_expression。更多 信息,请参阅数据类型优先级(Transact-SQL)。
因此,SQL引擎 关心查询中的所有子句(这是您问题的答案)。
我不完全理解这种情况下发生的事情。当您调用power()
函数时,编译器必须根据常量和列类型决定数值的精度。基于this SQL Fiddle,它选择38的精度和1的标度。然而,对值的简单算术产生36的精度和23的标度。我不知道为什么,最后,这会导致将值四舍五入到小数点后两位。也许为into
子句分配类型的逻辑与表达式的输入逻辑不完全匹配。