SQL Cap总和3个数字,100

时间:2012-01-05 16:45:07

标签: sql sql-server-2008 tsql casting precision

我的任务是一个有趣的问题。基本上,我必须计算3个不同的百分比:

SELECT @LowPercent = CAST(ROUND((@LowCount / @ValidCount) * 100.0, 0) AS INT)
SELECT @MidPercent = CAST(ROUND((@MidCount / @ValidCount) * 100.0, 0) AS INT)
SELECT @HighPercent = CAST(ROUND((@HighCount / @ValidCount) * 100.0, 0) AS INT)

但是,百分比的总和不能超过100.

请考虑以下情形:假设中间计算(例如@ XXXCount / @ ValidCount * 100.0)计算为1.8,91.5和6.6。舍入到0小数位产生2,92和7,总和为101.除了简单的“经验法则”,例如“抵消最高数字”,是否有直接的方法来满足这一要求?

感谢。

3 个答案:

答案 0 :(得分:2)

根据斧头的建议,如何保持低位和高位,并将@MidPercent更改为:

SELECT @MidPercent = 100 - (@LowPercent + @HighPercent)

答案 1 :(得分:2)

没有正确的方法来获得您想要的结果。将总和设为100的唯一正确方法是不首先对值进行舍入。

你已经是正确的结果。舍入每个值会给出舍入误差。如果您随后添加了值,则会累积错误,并且您得到的总数与添加未包含的值的总数不同。

通过更改值以获取特定总和,您将引入另一个错误,但是处于任意值。如果您仍想这样做,您只需计算前两个中的第三个值,无论您在何处添加错误都无关紧要,因为结果不正确。没有正确的方法可以添加这样的错误。

答案 2 :(得分:1)

首先,为什么int


如果你真的想使用int,那么更好的选择可能会降低最高优先级。

你可以减去最接近的.5


如果您需要0个位置,如果您进行一轮可能会出现问题:)所以您必须选择放置单位的位置。