Как рассчитать проценты с десятичными дробями в SQL?

StackOverflow https://stackoverflow.com/questions/400557

  •  03-07-2019
  •  | 
  •  

Вопрос

Как я могу преобразовать это в десятичное число в 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top