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

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

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

person Community    schedule 30.12.2008    source источник


Ответы (11)


convert(decimal(5,2),(100 * convert(float,[TotalVisit1])/convert(float,[TotalVisits]))) AS Visit1percent

Некрасиво, но работает.

person Shawn    schedule 30.12.2008
comment
Спасибо, это тот, с которым я ушел, так как он округлил число, все остальные ответы тоже сработали, хотя спасибо всем :) - person ; 30.12.2008
comment
Я обнаружил, что лучше преобразовать в десятичное число, чем в число с плавающей запятой. Некоторые деления лучше работают с десятичными, по крайней мере, на сервере Microsoft SQL: SELECT 5555/CAST(1000 AS с плавающей точкой), CAST(5555/CAST(1000 AS с плавающей запятой) AS numeric(5, 2)), 5555/CAST(1000 AS десятичной ), CAST(5555/CAST(1000 AS десятичное) AS числовое(5, 2)) - person user12861; 30.12.2008

Попробуй это:

(100.0 * [TotalVisit1]/[TotalVisits]) AS Visit1percent
person LeppyR64    schedule 30.12.2008
comment
Убедитесь, что вы добавили форматирование в свой слой презентации, чтобы округлить его до 1 или 2 знаков после запятой. В противном случае вы, вероятно, столкнетесь с такими вещами, как 33.33333... - person Michael Haren; 30.12.2008

CAST(ROUND([TotalVisit1]*100.0/[TotalVisits],2)as decimal(5,2)) as Percentage


Не безобразно и работает лучше и быстрее, наслаждайтесь!

person Ali    schedule 13.06.2017

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

person Ólafur Waage    schedule 30.12.2008

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

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

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

Str( 100.0 * [TotalVisit1]/[TotalVisits], 4, 1 ) AS Visit1percent
person Charles Bretana    schedule 30.12.2008
comment
Нравится ваш ответ str, красивый и аккуратный :) - person ; 30.12.2008
comment
Спасибо, сэр! ...рад помочь - person Charles Bretana; 30.12.2008

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

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

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

person Kent Fredric    schedule 30.12.2008

SELECT(ROUND(CAST(TotalVisit1 AS DECIMAL)/TotalVisits,1)) AS 'Visit1percent'

Это вернет десятичное число, а ROUND округлит его до одной цифры. Так что в вашем случае вы получите 76,6. Если вы не хотите никаких цифр, измените 1 на 0, а если вы хотите две цифры, измените их на 2.

person JoBaxter    schedule 29.05.2013

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

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

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

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

person Zameer Fouzan    schedule 02.08.2017

Это отлично работает для меня:

CAST((1.0 * SUM(ColumnA) /COUNT(ColumnB)) as decimal(5,2))

Надеюсь, это поможет кому-то в мире.

person Goku    schedule 10.01.2020

Это может не решить вашу проблему напрямую, но когда вы округляете набор чисел для отображения, вы никогда не гарантируете, что получите числа, которые в сумме составляют 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                     
person David Aldridge    schedule 30.12.2008
comment
Это вообще плохая идея. Если числа не складываются в 100 из-за округления, то так оно и есть. Игра с ними просто даст менее точные результаты. - person user12861; 30.12.2008
comment
Это ни хорошая, ни плохая идея, и в ней нет места обобщениям. Это просто техника для достижения конкретного гипотетического требования. - person David Aldridge; 31.12.2008
comment
Верно, но это плохое требование. Это приводит к некорректному отображению данных. И это не отвечает на поставленный выше вопрос. И это тоже не самое точное решение для прибавления процентов к 100, хотя оно может быть самым простым. - person user12861; 31.12.2008

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

ОКРУГЛ((100 * [Общее количество посещений1]/[Общее число посещений]), 1) AS Visit1percent

person larssbr    schedule 22.08.2013