2008-12-30 194 views
11

¿Cómo puedo convertir esto a un decimal en SQL? A continuación se muestra la ecuación y me da la respuesta como 78 (número entero), pero la verdadera respuesta es 78,6 (con un decimal) por eso es necesario para mostrar esto como otra manera el informe no va a contabilizar hasta 100%¿Cómo calculo los porcentajes con decimales en SQL?

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

Respuesta

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

Ugly, pero funciona.

+0

Gracias, este es el que se ha ido al redondear el número, las otras respuestas funcionaron bien, aunque gracias a cada uno :) –

+2

He encontrado es mejor convertir a decimal que flotar. Algunas divisiones funcionan mejor con decimal, al menos en Microsoft SQL Server: SELECCIONAR 5555/CAST (1000 AS float), CAST (5555/CAST (1000 AS float) AS numeric (5, 2)), 5555/CAST (1000 AS decimal), CAST (5555/CAST (1000 AS decimal) AS Numérico (5, 2)) – user12861

1

Al menos en MySQL (si ayuda), si desea usar números flotantes, debe usar un campo flotante tipo, no los campos int regulares.

17

Prueba esto:

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

Asegúrese de agregar formato en la capa de presentación para redondearlo a 1 o 2 decimales. De lo contrario, es probable que se encuentre con cosas como 33.33333 ... –

0

Es probablemente una exageración para hacer esto, pero puede que desee tener en cuenta todos los valores de fundición a flotadores para asegurar la precisión en todas las fases.

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

Tenga en cuenta, que realmente necesita para poner el código en aquí para el caso de que TotalVisits == 0 o se obtendrá una división por 0 respuesta.

1

Sólo añadir un decimal al 100

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

esto obliga a que todo el procesamiento a suceder en flotadores ... si desea que el producto final en forma de texto, y truncada para su visualización a un solo decimal, utilizar Str función

Str(100.0 * [TotalVisit1]/[TotalVisits], 4, 1) AS Visit1percent 
+0

Como su respuesta str bonita y pulcra :) –

+0

¡Gracias señor! ... contento de ayudar –

+0

o gracias perder;) –

-1

Esto podría no abordar se emite directamente, pero cuando alrededor de un conjunto de números de pantalla que nunca está garantizado para obtener los números que se suman a 100 a menos que tome precauciones especiales. Por ejemplo, al redondear 33.33333, 33.33333 y 33.33333 va a dejar uno corto en la suma, por lo que lo lógico es modificar el porcentaje del valor más grande en el conjunto para tener en cuenta cualquier diferencia.

Esta es una forma de hacerlo en Oracle SQL utilizando funciones analíticas y una cláusula de factorización de subconsulta (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      
+0

Esta es una mala idea en general. Si los números no se suman a 100 debido al redondeo, entonces es así. Monkeying con ellos solo va a dar resultados menos precisos. – user12861

+0

No es ni una buena ni una mala idea, y las generalidades no entran en eso. Es solo una técnica para lograr un requisito hipotético específico. –

+0

Es cierto, pero es un mal requisito. Lleva a datos visualizados incorrectamente. Y no responde la pregunta que se planteó anteriormente. Y tampoco es la solución más precisa para hacer que los porcentajes se sumen a 100, aunque puede ser el más simple. – user12861

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

Esto devolverá un decimal y la ronda se redondea a un dígito. Entonces en tu caso obtendrías 76.6. Si no quiere ningún dígito, cambie el 1 a 0 y si quiere dos dígitos cámbielo a 2.

-1

En ms Access Puede usar la función SQL ROUND (número, número de decimales), redondeará el número al número determinado de decimales:

REDONDO ((100 * [TotalVisit1]/[TotalVisits]), 1) como Visit1percent

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


No es feo y trabajar mejor y más rápido, disfrutar ¡eso!

0

Probar con esto, sin ronda 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 decimales que desea

por ejemplo, numérico (5,2) o numérico (5,4)

Cuestiones relacionadas