sets - SQL Server, división devuelve cero
grouping sets sql server (6)
Cuando usas solo enteros en una división, obtendrás una división entera. Cuando use (al menos uno) double o float, obtendrá la división de punto flotante (y la respuesta que desea obtener).
Así que puedes
- declarar una o ambas variables como flotante / doble
- lanzar una o ambas variables para flotar / duplicar.
No solo duplique el resultado de la división entera: la división ya se realizó como división entera, por lo que los números detrás del decimal ya están perdidos.
Aquí está el código que estoy usando en el ejemplo:
PRINT @set1
PRINT @set2
SET @weight= @set1 / @set2;
PRINT @weight
Aquí está el resultado:
47
638
0
Me gustaría saber por qué devuelve 0
lugar de 0,073667712
En SQL Server, la división directa de dos enteros devuelve un entero aunque el resultado sea el float. Hay un ejemplo a continuación para transmitirlo:
--1--
declare @weird_number_float float
set @weird_number_float=22/7
select @weird_number_float
--2--
declare @weird_number_decimal decimal(18,10)
set @weird_number_decimal=22/7
select @weird_number_decimal
--3--
declare @weird_number_numeric numeric
set @weird_number_numeric=22/7
select @weird_number_numeric
--Right way
declare @weird_number float
set @weird_number=cast(22 as float)/cast(7 as float)
select @weird_number
Solo el último bloque devolverá el 3,14285714285714. A pesar del segundo bloque definido con precisión correcta, el resultado será 3.00000.
O bien declarar set1 y set2 como flotantes en lugar de enteros o convertirlos en flotantes como parte del cálculo:
SET @weight= CAST(@set1 AS float) / CAST(@set2 AS float);
Porque es un número entero. Debe declararlos como números de coma flotante o decimales, o enviarlos a los mismos en el cálculo.
Simplemente multiplique la parte inferior de la división por 1.0 (o tantos decimales como desee)
PRINT @set1
PRINT @set2
SET @weight= @set1 / @set2 *1.00000;
PRINT @weight
si lo declaras como flotante o cualquier formato decimal, se mostrará
0
solamente
P.ej :
declare @weight float;
SET @weight= 47 / 638; PRINT @weight
Salida: 0
Si quieres la salida como
0.073667712
P.ej
declare @weight float;
SET @weight= 47.000000000 / 638.000000000; PRINT @weight