¿Cómo calculo los porcentajes con decimales en SQL?
Pregunta
¿Cómo puedo convertir esto a un decimal en SQL? A continuación se muestra la ecuación y obtengo la respuesta como 78 (entero) pero la respuesta real es 78.6 (con un decimal), así que necesito mostrar esto porque, de lo contrario, el informe no se sumará hasta el 100%
(100 * [TotalVisit1]/[TotalVisits]) AS Visit1percent
Solución
convert(decimal(5,2),(100 * convert(float,[TotalVisit1])/convert(float,[TotalVisits]))) AS Visit1percent
Feo, pero funciona.
Otros consejos
Prueba esto:
(100.0 * [TotalVisit1]/[TotalVisits]) AS Visit1percent
Al menos en MySQL (si es que ayuda), si desea usar números flotantes, tuvo que usar un campo flotante de tipo, no los campos int regulares.
Solo agrega un decimal a los 100
(100.0 * [TotalVisit1]/[TotalVisits]) AS Visit1percent
esto obliga a que todo el procesamiento se realice en flotadores ... si desea que la salida final sea texto y se trunque para mostrar solo una posición decimal, use la función Str
Str( 100.0 * [TotalVisit1]/[TotalVisits], 4, 1 ) AS Visit1percent
CAST(ROUND([TotalVisit1]*100.0/[TotalVisits],2)as decimal(5,2)) as Percentage
No es feo y funciona mejor y más rápido, ¡disfrútalo!
Probablemente sea excesivo hacerlo, pero es posible que desee considerar la posibilidad de convertir todos los valores a flotadores para garantizar la precisión en todas las fases.
(100.0 * ( [TotalVisit1]+0.0 )/([TotalVisits]+0.0) ) as Visit1percent
Tenga en cuenta que realmente necesita poner el código aquí en el caso de que TotalVisits == 0 o obtendrá una división por 0 respuestas.
SELECT(ROUND(CAST(TotalVisit1 AS DECIMAL)/TotalVisits,1)) AS 'Visit1percent'
Esto devolverá un decimal y la RONDA lo redondeará a un dígito. Así que en tu caso obtendrías 76.6. Si no desea que ningún dígito cambie el 1 a 0 y si desea dos dígitos, cámbielo a 2.
Intenta con esto, no redondear y str o Over (). Encontré esto como una forma más simple de hacerlo.
cast((count(TotalVisit1) * 100.0) /TotalVisits as numeric(5,3)) as [Visit1percent]
Puede cambiar el número de puntos decimales que desee
por ejemplo numérico (5,2) o numérico (5,4)
Es posible que esto no le resuelva el problema directamente, pero cuando redondee un conjunto de números para mostrar, nunca se le garantiza obtener números que se sumen a 100 a menos que tome precauciones especiales. Por ejemplo, redondear 33.33333, 33.33333 y 33.33333 te dejará un poco corto en la suma, por lo que lo lógico es modificar el porcentaje del mayor valor del conjunto para tener en cuenta cualquier diferencia.
Esta es una forma de hacerlo en Oracle SQL usando funciones analíticas y una cláusula de factorización de subconsultas (WITH) para generar datos de muestra.
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
En ms Access, puede usar la función SQL REDONDEAR (número, número de decimales), redondeará el número al número de decimales dado:
REDONDO ((100 * [TotalVisit1] / [TotalVisits]), 1) COMO Visit1percent