Как рассчитать проценты с десятичными знаками в SQL? - PullRequest
11 голосов
/ 30 декабря 2008

Как я могу преобразовать это в десятичную в SQL? Ниже приведено уравнение, и я получаю ответ как 78 (целое число), но реальный ответ - 78,6 (с десятичной дробью), поэтому мне нужно показать это, так как в противном случае отчет не будет соответствовать 100%

(100 * [TotalVisit1]/[TotalVisits]) AS Visit1percent

Ответы [ 10 ]

19 голосов
/ 30 декабря 2008

Попробуйте:

(100.0 * [TotalVisit1]/[TotalVisits]) AS Visit1percent
8 голосов
/ 30 декабря 2008
convert(decimal(5,2),(100 * convert(float,[TotalVisit1])/convert(float,[TotalVisits]))) AS Visit1percent

Ужасно, но работает.

1 голос
/ 13 июня 2017
CAST(ROUND([TotalVisit1]*100.0/[TotalVisits],2)as decimal(5,2)) as Percentage


Не уродливо и работай лучше и быстрее, наслаждайся этим!

1 голос
/ 30 декабря 2008

Просто добавьте десятичную к 100

(100.0 * [TotalVisit1]/[TotalVisits]) AS Visit1percent

это заставляет всю обработку происходить с плавающей точкой ... если вы хотите, чтобы окончательный вывод был в виде текста и обрезан для отображения только до одного десятичного знака, используйте функцию Str

Str( 100.0 * [TotalVisit1]/[TotalVisits], 4, 1 ) AS Visit1percent
1 голос
/ 30 декабря 2008

По крайней мере, в MySQL (если это помогает), если вы хотите использовать числа с плавающей запятой, вам нужно было использовать поле типа с плавающей запятой, а не обычные поля типа int.

0 голосов
/ 02 августа 2017

Попробуйте с этим, без раунда и ул или Over (). Я нашел это как более простой способ сделать это.

cast((count(TotalVisit1) * 100.0) /TotalVisits as numeric(5,3))  as [Visit1percent]

Вы можете изменить количество десятичных знаков по своему желанию на

например. числовой (5,2) или числовой (5,4)

0 голосов
/ 23 августа 2013

В мс Доступ. Вы можете использовать функцию SQL ROUND (число, количество десятичных знаков), она округляет число до заданного количества десятичных знаков:

ROUND ((100 * [TotalVisit1] / [TotalVisits]), 1) AS Visit1percent

0 голосов
/ 30 мая 2013
SELECT(ROUND(CAST(TotalVisit1 AS DECIMAL)/TotalVisits,1)) AS 'Visit1percent'

Это вернет десятичную дробь, а КРУГЛЫЙ округлит ее до одной цифры. Так что в вашем случае вы получите 76,6. Если вам не нужны цифры, измените 1 на 0, а если хотите две цифры, измените их на 2.

0 голосов
/ 30 декабря 2008

Это может не относиться к вашей проблеме напрямую, но когда вы округляете набор чисел для отображения, вы никогда не гарантированно получите числа, которые добавляются к 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                     
0 голосов
/ 30 декабря 2008

Вероятно, это излишне, но вы можете рассмотреть возможность приведения всех значений к плавающим, чтобы обеспечить точность на всех этапах.

(100.0 * ( [TotalVisit1]+0.0 )/([TotalVisits]+0.0) ) as Visit1percent

Обратите внимание, вам действительно нужно указать здесь код для случая, когда TotalVisits == 0, или вы получите ответ с делением на 0.

...