Сумма SQL Cap из 3 чисел на 100 - PullRequest
1 голос
/ 05 января 2012

Мне поставили интересную проблему. По сути, я должен вычислить 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 ]

2 голосов
/ 05 января 2012

В соответствии с предложением топора, как насчет того, чтобы оставить Low и High как есть и изменить @MidPercent на:

SELECT @MidPercent = 100 - (@LowPercent + @HighPercent)
2 голосов
/ 05 января 2012

Нет правильного способа получить желаемый результат. Единственный правильный способ получить сумму, равную 100, - это не округлять значения в первую очередь.

Результат, который у вас уже есть, правильный. Округление каждого значения дает ошибку округления. Если затем вы добавляете значения, ошибки накапливаются, и вы получаете общую сумму, отличную от той, которую вы получаете, добавляя необоснованные значения.

Изменяя значения, чтобы получить конкретную сумму, вы вводите еще одну ошибку, но в произвольном значении. Если вы все еще хотите это сделать, вы можете просто рассчитать третье значение из первых двух, не имеет значения, куда вы добавите ошибку, потому что результат в любом случае неверен. Нет правильного способа добавить такую ​​ошибку.

1 голос
/ 05 января 2012

Прежде всего, почему int?


Если вы действительно хотите использовать int, возможно, лучшим вариантом было бы сначала уменьшить самое высокое.

Или

Вы можете уменьшить ближайший к .5


Если вам нужно 0 мест, проблема может возникнуть, если вы сделаете раунд :) Так что вам придется выбирать, куда бросить юнит.

...