什么是正确的订单?应该是Round - >演员或演员 - >回合

时间:2018-06-13 10:08:45

标签: sql sql-server

当我尝试回合时,正确的顺序应该是什么?

   ,CAST(ROUND(COUNT(FIRE_SAFETY.DATE_COMPLETED) * 100.0 / COUNT(FIRE_SAFETY.EESS_ID),2) as  decimal(16,2)) AS Percentage
   ,ROUND(CAST(COUNT(FIRE_SAFETY.DATE_COMPLETED) * 100.0 / COUNT(FIRE_SAFETY.EESS_ID) as decimal(16,2)),2) AS Percentage

3 个答案:

答案 0 :(得分:3)

如果你需要回答两位小数,你应该使用强制转换为十进制(n,2)。

COUNT()函数返回整数。当运算符组合了两种不同数据类型的表达式时,数据类型优先级的规则指定具有较低优先级的数据类型转换为具有较高优先级的数据类型。

因此任何100.0的操作都会导致隐式十进制转换为100.0类型,即带小数位。

所以下面的陈述应该足够了

 ,CAST(COUNT(FIRE_SAFETY.DATE_COMPLETED) * 100.0 / COUNT(FIRE_SAFETY.EESS_ID) as decimal(16,2)) AS Percentage

请参阅 this MSDN link ,了解基于表达式中的组合类型在SQL Server中如何影响精度和规模。

优先规则 another mSDN link

答案 1 :(得分:1)

只要您将十进制转换的小数舍入到相同的小数位数,它就是一样的。

转换为较低比例的DECIMAL会自动舍入最后一位数字。

SELECT
    CONVERT(DECIMAL(18,2), '1.009'), -- 1.01
    CONVERT(DECIMAL(18,2), '1.005'), -- 1.01
    CONVERT(DECIMAL(18,2), '1.004'), -- 1.00
    CONVERT(DECIMAL(18,2), '1.001') -- 1.00

转换为十进制(具有相同的小数位数)后的舍入是没有意义的,而在舍入后转换为十进制只会降低它的比例。

DECLARE @BigDecimal DECIMAL(30,10) = '1.123456789'

SELECT
    Original = @BigDecimal,                                                 -- 1.1234567890
    Rounded = ROUND(@BigDecimal, 2),                                        -- 1.1200000000
    RoundedThenDecimal = CONVERT(DECIMAL(18,2), ROUND(@BigDecimal, 2)),     -- 1.12
    Decimal = CONVERT(DECIMAL(18, 2), @BigDecimal),                         -- 1.12
    DecimalThenRounded = ROUND(CONVERT(DECIMAL(18, 2), @BigDecimal), 2)     -- 1.12

结论:只需使用您需要的比例转换为十进制,然后忘记舍入。

答案 2 :(得分:0)

首先我们应该转换/转换然后再转。 来自ROUND的文档:

ROUND( numeric_expression ,长度[,功能])