Как рассчитать проценты с десятичными дробями в SQL?
Вопрос
Как я могу преобразовать это в десятичное число в SQL?Ниже приведено уравнение, и я получаю ответ как 78 (целое число), но реальный ответ — 78,6 (с десятичной дробью), поэтому мне нужно показать это, иначе отчет не будет соответствовать 100%.
(100 * [TotalVisit1]/[TotalVisits]) AS Visit1percent
Решение
convert(decimal(5,2),(100 * convert(float,[TotalVisit1])/convert(float,[TotalVisits]))) AS Visit1percent
Некрасиво, но это работает.
Другие советы
Попробуй это:
(100.0 * [TotalVisit1]/[TotalVisits]) AS Visit1percent
По крайней мере, в MySQL (если это поможет), если вы хотите использовать числа с плавающей запятой, вам нужно использовать поле типа float, а не обычные поля int.
Просто прибавьте десятичную дробь к 100.
(100.0 * [TotalVisit1]/[TotalVisits]) AS Visit1percent
это заставляет всю обработку выполняться в числах с плавающей запятой...если вы хотите, чтобы окончательный вывод был в виде текста и был усечен для отображения только до одного десятичного знака, используйте функцию Str
Str( 100.0 * [TotalVisit1]/[TotalVisits], 4, 1 ) AS Visit1percent
CAST(ROUND([TotalVisit1]*100.0/[TotalVisits],2)as decimal(5,2)) as Percentage
Не уродливо, работает лучше и быстрее, наслаждайтесь!
Вероятно, это излишне, но вы можете рассмотреть возможность приведения всех значений к числам с плавающей запятой, чтобы обеспечить точность на всех этапах.
(100.0 * ( [TotalVisit1]+0.0 )/([TotalVisits]+0.0) ) as Visit1percent
Обратите внимание: вам действительно нужно поместить сюда код для случая, когда TotalVisits == 0, иначе вы получите ответ деления на 0.
SELECT(ROUND(CAST(TotalVisit1 AS DECIMAL)/TotalVisits,1)) AS 'Visit1percent'
Это вернет десятичное число, а ОКРУГЛ округлит его до одной цифры.В вашем случае вы получите 76,6.Если вам не нужны никакие цифры, измените 1 на 0, а если вам нужны две цифры, измените их на 2.
Попробуйте это, без round и str или Over().я нашел это как более простой способ сделать это.
cast((count(TotalVisit1) * 100.0) /TotalVisits as numeric(5,3)) as [Visit1percent]
Вы можете изменить количество десятичных знаков по своему усмотрению.
напримерчисловое (5,2) или числовое (5,4)
Возможно, это не решит вашу проблему напрямую, но когда вы округляете набор чисел для отображения, вы никогда не гарантированно получите числа, которые в сумме дают 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
В MS Access вы можете использовать функцию SQL ROUND(число, количество десятичных знаков), она округлит число до заданного количества десятичных знаков:
ROUND((100 * [TotalVisit1]/[TotalVisits]),1) КАК Visit1percent