Это может не относиться к вашей проблеме напрямую, но когда вы округляете набор чисел для отображения, вы никогда не гарантированно получите числа, которые добавляются к 100, если вы не примете особые меры предосторожности. Например, в результате округления 33,33333, 33,33333 и 33,33333 у вас останется одна короткая сумма, поэтому логичным будет изменить процентное соотношение для наибольшего значения в наборе с учетом любой разницы.
Вот способ сделать это в Oracle SQL с использованием аналитических функций и предложения факторинга подзапроса (WITH) для генерации образцов данных.
with data as (select 25 num from dual union all
select 25 from dual union all
select 25 from dual)
select num,
case
when rnk = 1
then 100 - sum(pct) over (order by rnk desc
rows between unbounded preceding
and 1 preceding)
else pct
end pct
from
(
select num,
round(100*ratio_to_report(num) over ()) pct,
row_number() over (order by num desc) rnk
from data
)
/
NUM PCT
---------------------- ----------------------
25 33
25 33
25 34