¿Cómo obtener un resultado flotante dividiendo dos valores enteros usando T-SQL?

173

Usando T-SQL y Microsoft SQL Server, me gustaría especificar el número de dígitos decimales cuando hago una división entre 2 números enteros como:

select 1/3

Eso actualmente regresa 0. Me gustaría que volviera 0,33.

Algo como:

select round(1/3, -2)

Pero eso no funciona. ¿Cómo puedo lograr el resultado deseado?

LaBracca
fuente
3
¿Has probado 1.0 / 3?
Thilo
Las respuestas que obtuve son más que suficientes
LaBracca

Respuestas:

277

Las sugerencias de stb y xiowl están bien si buscas una constante. Si necesita utilizar campos o parámetros existentes que son enteros, puede convertirlos primero en flotantes:

SELECT CAST(1 AS float) / CAST(3 AS float)

o

SELECT CAST(MyIntField1 AS float) / CAST(MyIntField2 AS float)
Ricardo
fuente
O puede convertirlos como decimales, si desea un resultado decimal.
Tim
30
SELECT 1.0 * MyInt1 / MyInt2
Troglo
@TroubleZero para el uso de MySQLdecimal
itsazzad
muchas gracias, me salvaste el día. Intenté CAST (7/3 AS float) pero devolví 2 nuevamente. Entonces los números de reparto se resuelven mi problema.
Yasin Yörük
3
no es necesario emitir dividendos y divisores, consulte la respuesta de
@MS
70

Porque SQL Server realiza la división de enteros. Prueba esto:

select 1 * 1.0 / 3

Esto es útil cuando pasa enteros como parámetros.

select x * 1.0 / y
xiaowl
fuente
1
Incluso puedes dejar de lado los ceros.
John
43

No es necesario lanzar ambos. El tipo de datos de resultado para una división es siempre el que tiene mayor prioridad de tipo de datos . Por lo tanto, la solución debe ser:

SELECT CAST(1 AS float) / 3

o

SELECT 1 / CAST(3 AS float)
em
fuente
27

utilizar

select 1/3.0

Esto hará el trabajo.

stb
fuente
13

Entiendo que CASTing to FLOATno está permitido en MySQL y generará un error cuando intente, CAST(1 AS float)como se indica en MySQL dev .

La solución a esto es simple. Solo haz

(1 + 0.0)

Luego use ROUNDpara lograr un número específico de lugares decimales como

ROUND((1+0.0)/(2+0.0), 3)

El SQL anterior divide 1 por 2 y devuelve una coma flotante a 3 decimales, como sería 0.500.

Se pueden CASTlos siguientes tipos: binario, char, fecha, fecha y hora, decimal, json, nchar, con signo, hora y sin signo .

Delfín Supremo
fuente
3
MySQL sí permite CAST, simplemente no permite la transmisión FLOAT. Reparto a en su DECIMALlugar. Ver, por ejemplo, stackoverflow.com/questions/7368163/… .
markusk
7

Parece que este truco funciona en SQL Server y es más corto (según las respuestas anteriores)

SELECT 1.0*MyInt1/MyInt2

O:

SELECT (1.0*MyInt1)/MyInt2
Troglo
fuente
2
Esto me gustó más, incluso se ve bien para los cálculos porcentuales:SELECT 100.0 * @Elapsed / @Total
EliSherer
3

Utilizar este

select cast((1*1.00)/3 AS DECIMAL(16,2)) as Result

Aquí, en este sql, primero convierta a flotante o multiplíquelo por 1.00. La salida será un número flotante. Aquí considero 2 decimales. Puedes elegir lo que necesitas.

nazmul.3026
fuente
2

Si vino aquí (como yo) para encontrar la solución para el valor entero , aquí está la respuesta:

CAST(9/2 AS UNSIGNED)

devuelve 5

troyano
fuente